你如何将Mongo文档与对象同步?

时间:2014-06-23 07:08:26

标签: mongodb

假设我有一个名为MyCollection的集合,只有一个文档和一个名为MyObject的对象

db.MyCollection.findOne()

{ _id: "23r3d2", xyz: "something", abc: "something else" }

为MyObject

{ xyz: "lalala" }

如果你这样做:

db.MyCollection.update( db.MyCollection.findOne() , { $set: MyObject } )

结果MyCollection是:

{ _id: "23r3d2", xyz: "lalala", abc: "something else" }

MyObject不同,原因是$set会:

  1. 设置密钥的值(如果密钥已经存在)。
  2. 如果密钥尚不存在,请添加新密钥和值。
  3. 然而,它不会

    1. 如果$ set作为参数的对象中不存在该字段,则从集合中删除键。
    2. 你如何编码以便:

      db.MyCollection.findOne()

      { _id: "23r3d2", xyz: "something", abc: "something else" }
      

      会变成:

      db.MyCollection.findOne()
      
      { _id: "23r3d2", xyz: "lalala"}
      

      将此对象作为参数放在某处:

      MyObject
      
      { xyz: "lalala" }
      

      我希望避免明确定义要排除的字段。

2 个答案:

答案 0 :(得分:1)

只是做:

db.myCollection.update(db.myCollection.findOne(), MyObject);

它将保持相同的_id但替换整个对象。

顺便说一句,如果您只有一个元素,则可以使用空查询进行搜索:{},而不是db.myCollection.findOne()

答案 1 :(得分:0)

当您希望拥有包含单个文档的集合时,我很难找到用例。你可能想要的是findAndModify,例如:

db.collection.findAndModify({
    query: <document>,
    sort: <document>,
    remove: <boolean>,
    update: <document>,
    new: <boolean>,
    fields: <document>,
    upsert: <boolean>
});

这是一个完整的documentation