मैं MongoDB में सभी दस्तावेज़ों के लिए फ़ील्ड का नाम कैसे बदल सकता हूं?


223

मान लिया कि मेरे पास 5000 रिकॉर्ड के साथ MongoDB में एक संग्रह है, प्रत्येक में कुछ समान है:

{
"occupation":"Doctor",
"name": {
   "first":"Jimmy",
   "additional":"Smith"
}

क्या सभी दस्तावेजों में "अतिरिक्त" "अंतिम" क्षेत्र का नाम बदलने का एक आसान तरीका है? मैंने डॉक्यूमेंटेशन में $ पुनर्नामक ऑपरेटर को देखा था लेकिन मैं वास्तव में स्पष्ट नहीं हूं कि उपक्षेत्र को कैसे निर्दिष्ट किया जाए।

जवाबों:


423

आप उपयोग कर सकते हैं:

db.foo.update({}, {$rename:{"name.additional":"name.last"}}, false, true);

या उन डॉक्स को अपडेट करने के लिए जिनमें संपत्ति होती है:

db.foo.update({"name.additional": {$exists: true}}, {$rename:{"name.additional":"name.last"}}, false, true);

false, trueउपरोक्त विधि में हैं: { upsert:false, multi:true }। आपको अपने सभी रिकॉर्ड multi:trueको अपडेट करने की आवश्यकता है ।

या आप पूर्व का उपयोग कर सकते हैं:

remap = function (x) {
  if (x.additional){
    db.foo.update({_id:x._id}, {$set:{"name.last":x.name.additional}, $unset:{"name.additional":1}});
  }
}

db.foo.find().forEach(remap);

MongoDB 3.2 में आप उपयोग कर सकते हैं

db.students.updateMany( {}, { $rename: { "oldname": "newname" } } )

इसका सामान्य सिंटैक्स है

db.collection.updateMany(filter, update, options)

https://docs.mongodb.com/manual/reference/method/db.collection.updateMany/


52
: बस आप दीवार के खिलाफ अपने सिर की पिटाई कर रहे हैं क्योंकि कुछ भी नहीं बड़े पैमाने पर अद्यतन किया जाता है के लिए एक शब्द false, trueमें updateकी विधि $renameसंस्करण हैं: { upsert:false, multi:true }। आपको multi:trueअपने सभी रिकॉर्ड को अपडेट करने की आवश्यकता है ।
रिका

1
और अगर मुझे मिल रहा है upsert:trueतो फ़ील्ड नाम बना देगा यदि फ़ील्ड नाम मौजूद नहीं है, तो डिफ़ॉल्ट है false
IGRACH

1
किसी कारण से, यह मेरे लिए तब काम नहीं करता था जब मैं "table.field" : "table.field"वाक्य रचना का उपयोग करता था । यह काम किया जब मैं सिर्फ "field" : "field"वाक्यविन्यास का इस्तेमाल किया ।
बेन

@Steve name.lastनहीं है table.field। यदि आप प्रश्न पढ़ते हैं, तो आप देख सकते हैं कि nameक्षेत्र एक वस्तु रखता है।
मार्क डिंगेना

क्या यह सरणियों के साथ भी काम कर रहा है? क्या मैं कर सकता हूँ db.foo.update({}, {$rename:{"name.0.additional":"name.0.last"}}, false, true):?
bncc

49

प्रयास करें db.collectionName.update({}, { $rename : { 'name.additional' : 'name.last' } }, { multi: true } )

और इसे पढ़ें :) http://docs.mongodb.org/manual/reference/operator/rename/#_S_rename


1
कृपया लिंक को अपडेट करें, ऐसा लगता है कि नए दस्तावेज़ में विकल्पों upsertऔर multiविकल्पों के बारे में कुछ नहीं कहा गया है ।
अकोस के

1
नए प्रलेखन के अनुसार, यह दिखना चाहिए: db.collectionName.updateMany ({}, {$ नाम: {'name.additional': 'name.last'}})
1r3x

15

यदि आपको कभी भी मोंगॉयड के साथ ऐसा करने की आवश्यकता होती है:

Model.all.rename(:old_field, :new_field)

अपडेट करें

सिंटैक्स में परिवर्तन होता है monogoid 4.0.0:

Model.all.rename(old_field: :new_field)

11
पिछले monogoid में वाक्य रचना में परिवर्तन (4.0.0) हैModel.all.rename(old_field: :new_field)
Calin

मैं एम्बेड किए गए दस्तावेज़ के लिए इस विकल्प का उपयोग कैसे कर सकता हूं
हुजैफा सैफुद्दीन

2

कोई भी संभवतः इस आदेश का उपयोग संग्रह से एक क्षेत्र का नाम बदलने के लिए कर सकता है (किसी भी _id का उपयोग नहीं करके):

dbName.collectionName.update({}, {$rename:{"oldFieldName":"newFieldName"}}, false, true);

देसी देखें


0

यह नोडज कोड केवल यही करता है, जैसा कि @ फेलिक्स यान ने उल्लेख किया है कि पूर्व तरीका ठीक काम करने के लिए लगता है, मुझे कुछ अन्य मुद्दों के साथ उम्मीद थी कि यह मदद करता है।

यह कॉलम "oldColumnName" का नाम बदलकर "newColumnName" होगा "दस्तावेज"

var MongoClient = require('mongodb').MongoClient
  , assert = require('assert');

// Connection URL
//var url = 'mongodb://localhost:27017/myproject';
var url = 'mongodb://myuser:mypwd@myserver.cloud.com:portNumber/databasename';

// Use connect method to connect to the server
MongoClient.connect(url, function(err, db) {
  assert.equal(null, err);
  console.log("Connected successfully to server");

  renameDBColumn(db, function() {
    db.close();
  });

});

//
// This function should be used for renaming a field for all documents
//
var renameDBColumn = function(db, callback) {
  // Get the documents collection
  console.log("renaming database column of table documents");
  //use the former way:
  remap = function (x) {
    if (x.oldColumnName){
      db.collection('documents').update({_id:x._id}, {$set:{"newColumnName":x.oldColumnName}, $unset:{"oldColumnName":1}});
    }
  }

  db.collection('documents').find().forEach(remap);
  console.log("db table documents remap successfully!");
}

0

मैं उपयोग कर रहा हूँ, Mongo 3.4.0

$ नाम बदलने वाला ऑपरेटर किसी फ़ील्ड का नाम अपडेट करता है और उसके निम्न रूप होते हैं:

{$rename: { <field1>: <newName1>, <field2>: <newName2>, ... } }

उदाहरण के लिए

db.getCollection('user').update( { _id: 1 }, { $rename: { 'fname': 'FirstName', 'lname': 'LastName' } } )

नया फ़ील्ड नाम मौजूदा फ़ील्ड नाम से भिन्न होना चाहिए। किसी एम्बेडेड दस्तावेज़ में निर्दिष्ट करने के लिए, डॉट नोटेशन का उपयोग करें।

यह ऑपरेशन संग्रह में सभी दस्तावेजों के नाम के लिए फ़ील्ड nmae का नाम रखता है:

db.getCollection('user').updateMany( {}, { $rename: { "add": "Address" } } )

db.getCollection('user').update({}, {$rename:{"name.first":"name.FirstName"}}, false, true);

झूठे के ऊपर की विधि में, सत्य हैं: {upsert: false, multi: true}। अपने सभी रिकॉर्ड अपडेट करें, आपको बहु की आवश्यकता है - सत्य।

एक एंबेडेड दस्तावेज़ में एक फ़ील्ड का नाम बदलें

db.getCollection('user').update( { _id: 1 }, { $rename: { "name.first": "name.fname" } } )

लिंक का उपयोग करें: https://docs.mongodb.com/manual/reference/operator/update/rename/


एम्बेडिंग विकल्प काम नहीं कर रहा है ... मुझे यह त्रुटि मिलती है "तत्व का पता लगाने के लिए भाग (address.city का हिस्सा) का उपयोग नहीं कर सकते हैं"
हुजैफा सैफुद्दीन

0

यदि आप MongoMapper का उपयोग कर रहे हैं, तो यह काम करता है:

Access.collection.update( {}, { '$rename' => { 'location' => 'location_info' } }, :multi => true )
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.