মঙ্গুজ, অবজেক্টের অ্যারেতে মানগুলি আপডেট করুন


94

কোনও অবজেক্টে মান আপডেট করার কোনও উপায় আছে কি?

{
  _id: 1,
  name: 'John Smith',
  items: [{
     id: 1,
     name: 'item 1',
     value: 'one'
  },{
     id: 2,
     name: 'item 2',
     value: 'two'
  }]
}

বলুন আমি আইডি = 2 যেখানে আইটেমের জন্য নাম এবং মান আইটেম আপডেট করতে চান;

আমি নিম্নলিখিত ডাব্লু / মঙ্গুজ চেষ্টা করেছি:

var update = {name: 'updated item2', value: 'two updated'};
Person.update({'items.id': 2}, {'$set':  {'items.$': update}}, function(err) { ...

এই পদ্ধতির সাথে সমস্যা হ'ল এটি সম্পূর্ণ অবজেক্টকে আপডেট / সেট করে, তাই এই ক্ষেত্রে আমি আইডি ফিল্ডটি হারাব।

একটি মানচিত্রে অ্যারে নির্দিষ্ট মান নির্ধারণ করার জন্য অন্য মানগুলি ছেড়ে যাওয়ার জন্য মঙ্গুজের আরও ভাল উপায় কি আছে?

আমি কেবল ব্যক্তির জন্যও জিজ্ঞাসা করেছি:

Person.find({...}, function(err, person) {
  person.items ..... // I might be able to search through all the items here and find item with id 2 then update the values I want and call person.save().
});

উত্তর:


162

আপনি কাছাকাছি; এটি করার জন্য আপনাকে $আপডেট অপারেটরের ব্যবহারের ক্ষেত্রে ডট নোটেশনটি ব্যবহার করা উচিত :

Person.update({'items.id': 2}, {'$set': {
    'items.$.name': 'updated item2',
    'items.$.value': 'two updated'
}}, function(err) { ...

হ্যালো, যখন আমি ঠিক আপনার পরামর্শ দিয়েছি। বোর্ড.আপডেট ({_id: বোর্ড._id, "users.username": req.user.username}, {$ সেট: users "ব্যবহারকারীগণ $। সর্বশেষ দেখা হয়েছে": নতুন তারিখ ()} function, ফাংশন (ভুল) { ); আমি একটি ত্রুটি পেয়েছি: উপাদানটি ({ব্যবহারকারীগণ: [{ব্যবহারকারী নাম: "এনএলএম", _ আইডি: অবজেক্টআইডি ('583c8cc3813daa6c29f69cb0'), স্থিতি: "আমন্ত্রিত", ভূমিকা: "অংশটি ব্যবহার করতে পারবেন না পর্যালোচক "}]})। আমি কিছু আলাদাভাবে করেছি?
পিটার হুয়াং

4
এটি দুর্দান্ত কাজ করে, আপনাকে ধন্যবাদ। তবে, কোনও আইটেম অ্যারে না থাকলে তৈরি করার কোনও উপায় আছে?
সের্গেই মেল

@SergeyMell যদি আমি মনে করি যে একটি সমাধান হতে পারে: stackoverflow.com/a/33577318/6470918
Grzegorz Brzęczyszczykiewicz

সংগ্রহের সমস্ত নথিতে আমি কীভাবে আইডি = 2 এর জন্য নাম আপডেট করব?
রড

4
আপনার যদি অ্যারের ভিতরে বস্তুর একটি অ্যারে থাকে তবে এটি কীভাবে কাজ করবে? ন্যায়বিচারের পরিবর্তে items.$.nameআপনি কি পছন্দ করেছেন items.users.$.status? যে কাজ করবে?
স্টিভি স্টার


12

এটি করার জন্য একটি মঙ্গুজ উপায় আছে।

const itemId = 2;
const query = {
  item._id: itemId 
};
Person.findOne(query).then(doc => {
  item = doc.items.id(itemId );
  item["name"] = "new name";
  item["value"] = "new value";
  doc.save();

  //sent respnse to client
}).catch(err => {
  console.log('Oh! Dark')
});

আপনি যদি অভিভাবক নথির পাশাপাশি অ্যারে আইটেমটিতে একটি অপারেশন করছেন তবে এই পদ্ধতিটি কার্যকর।
জেরেমি

5

প্রতিটি নথির জন্য, আপডেট অপারেটর একাধিক মান সেট$set করতে পারে , সুতরাং অ্যারেতে পুরো বস্তুর প্রতিস্থাপনের পরিবর্তে আপনি পৃথকভাবে অবজেক্টের ক্ষেত্র এবং ক্ষেত্রগুলি সেট করতে পারেন ।itemsnamevalue

{'$set':  {'items.$.name': update.name , 'items.$.value': update.value}}

3

একটি জিনিস মনে রাখতে হবে, যখন আপনি একাধিক শর্তের ভিত্তিতে অ্যারেতে বস্তুটি অনুসন্ধান করছেন তখন then ইলেম ম্যাচটি ব্যবহার করুন

Person.update(
   {
     _id: 5,
     grades: { $elemMatch: { grade: { $lte: 90 }, mean: { $gt: 80 } } }
   },
   { $set: { "grades.$.std" : 6 } }
)

এখানে ডক্স রয়েছে



2

নীচে কীভাবে বস্তুর অ্যারেতে মান আরও গতিশীলভাবে আপডেট করা যায় তার একটি উদাহরণ।

Person.findOneAndUpdate({_id: id}, 
{ 
  "$set": {[`items.$[outer].${propertyName}`]: value} 
},
{ 
  "arrayFilters": [{ "outer.id": itemId }]
},
function(err, response) {
  ...
})

মনে রাখবেন যে সেভাবে এটি করে আপনি নীড়যুক্ত অ্যারের আরও গভীর স্তর আপডেট করতে সক্ষম হবেন arrayFiltersযেমন অতিরিক্ত যোগ করে :

"$set": {[`items.$[outer].innerItems.$[inner].${propertyName}`]: value} 

"arrayFilters":[{ "outer.id": itemId },{ "inner.id": innerItemId }]

আমি আসা করি এটা সাহায্য করবে. শুভকামনা!


0

মঙ্গুজে আমরা সহজ অ্যারের মতো আপডেট করতে পারি

user.updateInfoByIndex(0,"test")

User.methods.updateInfoByIndex = function(index, info) ={
    this.arrayField[index]=info
    this.save()
}

4
আপনার উত্তরটি কিছু ব্যাখ্যা সহ আরও সহায়ক হবে। এটি সম্পাদনা বিবেচনা করুন।
ও জোনস

0

মঙ্গুজে, আমরা নিম্নলিখিত উপায়ে নির্দিষ্ট মানটিতে $setডট ( .) স্বরলিপি ব্যবহার করে অ্যারের মান আপডেট করতে পারি

db.collection.update({"_id": args._id, "viewData._id": widgetId}, {$set: {"viewData.$.widgetData": widgetDoc.widgetData}})

আপনি দয়া করে ব্যাখ্যা দিয়ে উত্তর সম্পাদনা করতে পারেন, বা প্রশ্নের সাথে সম্পর্কিত?
নিখিল মুখ্যমন্ত্রী

4
আপনি সম্ভবত আমার প্রশ্ন কটাক্ষপাত করা যায়নি, নকুল আমার প্রশ্নের সাথে একটি অংশ, যা ব্যবহার সরানোর হয় $ [] যদিও এটি CLI কাজ stackoverflow.com/questions/64223672/...
nrmad

0

অন্য সমাধানগুলি চেষ্টা করে যা ভাল কাজ করেছে, তবে তাদের উত্তরগুলির পরিণতিটি হ'ল যে ইতিমধ্যে বিদ্যমান ক্ষেত্রগুলি এতে নতুন কিছু যোগ করতে যোগ করবে তা আপডেট করবে, তাই আমি এটি নিয়ে এসেছি।

 Person.update({'items.id': 2}, {$set: {
    'items': { "item1",  "item2",  "item3",  "item4" } }, {upsert: 
true })
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.