আমি মঙ্গোডিবি-তে সমস্ত নথির ক্ষেত্রটির নাম কীভাবে নামকরণ করতে পারি?


223

ধরে নিচ্ছি আমার কাছে 5000 টি রেকর্ড সহ মোঙ্গোডিবিতে একটি সংগ্রহ রয়েছে যার প্রতিটির মতো কিছু রয়েছে:

{
"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);

মঙ্গোডিবি 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
: শুধু আপনি প্রাচীর বিরুদ্ধে আপনার মাথা banging যদি কারণ কিছুই ভর আপডেট করা হয় জন্য একটি শব্দ false, trueমধ্যে updateপদ্ধতি $renameসংস্করণ আছেন: { upsert:false, multi:true }multi:trueআপনার সমস্ত রেকর্ড আপডেট করার দরকার পড়ে ।
রিকিআ 14

1
এবং যদি আমি এটি পাই তবে upsert:trueক্ষেত্রের নামটি যদি ক্ষেত্রের নামটি না উপস্থিত থাকে তবে এটি ডিফল্ট হবে false
ইগ্রাক

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)?
বিএনসিসি

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'}})
1r3k

15

যদি কখনও আপনার প্রয়োজন হয় মঙ্গয়েড সহ:

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

হালনাগাদ

সিনট্যাক্সে এখানে পরিবর্তন রয়েছে monogoid 4.0.0:

Model.all.rename(old_field: :new_field)

11
সর্বশেষ মনোগয়েড (4.0.0)Model.all.rename(old_field: :new_field)
কলিন

এম্বেড করা নথির জন্য আমি এই বিকল্পটি কীভাবে ব্যবহার করতে পারি
সাইফুদ্দিন

2

সংগ্রহ থেকে কোনও ক্ষেত্রটির নাম পরিবর্তনের জন্য যে কেউ এই কমান্ডটি ব্যবহার করতে পারে (কোনও _ আইডি ব্যবহার না করে):

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

দেখতে অবগতির জন্য


0

এই নোডজেস কোডটি কেবল এটিই করে, যেমন @ ফ্যালিক্স ইয়ান উল্লেখ করেছেন যে পূর্বের পদ্ধতিটি ঠিকঠাকভাবে কাজ করে বলে মনে হচ্ছে, অন্যান্য স্নিপেটগুলির সাথে আমার কিছু সমস্যা রয়েছে আশা করি এটি সাহায্য করবে।

এটি কলামটির নাম "ওল্ড কলামনাম" রাখবে টেবিলের "নতুন কলামনাম" হিসাবে "নথিগুলি"

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

আমি ব্যবহার করছি, মঙ্গো 3.4.0

$ নাম পরিবর্তনকারী অপারেটর একটি ফিল্ডের নাম আপডেট করে এবং নিম্নলিখিত ফর্মটি রাখে:

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

যেমন

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

নতুন ক্ষেত্রের নামটি অবশ্যই বিদ্যমান ক্ষেত্রের নাম থেকে পৃথক হতে হবে। এম্বেড থাকা নথিতে একটি নির্দিষ্ট করতে, ডট স্বরলিপি ব্যবহার করুন।

এই ক্রিয়াটি সংগ্রহের সমস্ত দস্তাবেজের জন্য নামটির জন্য ফিল্ডটির নাম পরিবর্তন করে:

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

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

মিথ্যা, উপরের পদ্ধতিতে সত্য: {উপস্থাপক: মিথ্যা, বহু: সত্য your। আপনার সমস্ত রেকর্ড আপডেট করার জন্য আপনার একাধিক: সত্য প্রয়োজন।

এমবেডড ডকুমেন্টে একটি ফিল্ডের নাম পরিবর্তন করুন

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

ব্যবহার লিঙ্ক: https://docs.mongodb.com/manual/references/operator/update/rename/


এম্বেডিং বিকল্পটি কাজ করছে না ... আমি এই ত্রুটিটি পেয়েছি "উপাদানটি অতিক্রম করতে অংশ (ঠিকানার ঠিকানা) ব্যবহার করতে পারবেন না"
হুজাইফা সাইফুদ্দিন

0

আপনি যদি মঙ্গোমাপার ব্যবহার করছেন তবে এটি কাজ করে:

Access.collection.update( {}, { '$rename' => { 'location' => 'location_info' } }, :multi => true )
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.