数组对象内的单键值更新

时间:2016-11-10 13:55:54

标签: node.js mongodb

我试图更新单键值Array对象 在MongoDB集合中。但它使用单个键值更新所有值。

MongoDB中的以前的Json数据

result: [
    {        
      "firstname": A,
      "lastname": B,
      "age": 5     
    }
]
  "_id" : "582187d461cc8230bf0aba03"

我在做什么我正在更新单个键值 我想只更新单个键值 名字:A到D,我需要所有剩余的值必须相同(坚持)。 但是改变了,只更新了单个键值对。

 {
   result: [
   {        
     "first name": A 
   }
   ]
  "_id" : "582187d461cc8230bf0aba03"
  }

姓氏和年龄都消失了。我正在使用节点js来更新集合。

使用此脚本

  var query = {"_id" : "582187d461cc8230bf0aba03"};
  var arr = [];
   userObj = {
   firstname : B
  };
   arr.push(userObj);
  update = {
  result : arr
   };

  var = options = {new : true, upsert : true};

   user.findOneAndUpdate(query, update, options, function(err, result)   { 
   if(err);
    console.log(err); 
    res.send(result);
   }

有任何命令,所以我只能更新单个键值,所有值都将保留在集合

1 个答案:

答案 0 :(得分:0)

是的,因此默认情况下,当您进行更新时,它会将文档A替换为文档B.

您希望使用$set运算符仅更新特定字段,而不是替换整个文档。

例如,如果你有:

{
  _id: 123,
  first_name: "John",
  last_name: "Smith",
  phone_number: "(123)456-7890"
}

你做了

db.user.update({_id: 123}, {first_name: "Bob"})

您将替换整个文档并获取:

{
  _id: 123,
  first_name: "Bob"
}

但如果你这样做:

db.user.update({ _id: 123 }, { $set: { first_name: "Bob" } })

您将获得预期的结果:

{
  _id: 123,
  first_name: "Bob",
  last_name: "Smith",
  phone_number: "(123)456-7890"
}

在您的情况下,您可以尝试:

var obj = {
  firstname: B
};

user.findOneAndUpdate(query, {$set: obj}, options, function(err, result)