如何在MongoDB中更新文档并避免重复?

时间:2014-08-08 17:15:32

标签: mongodb

我在MongoDB中遇到问题,主要的想法是我有一个像这样表示的用户集合:

{
   "_id" : ObjectId("53e4ac672a486e660a6fe930"),
   "username" : "foo",
   "firstname" : "bar",
   "lastname" : "foobar"
}

我想在一个名为feeds的集合中插入这样的代码:

{
   "username" : "john",
   "readed" : 0
}

预期结果应如下所示:

{
   "_id" : ObjectId("53e4ac672a486e660a6fe930"),
   "username" : "foo",
   "firstname" : "bar",
   "lastname" : "foobar",
   "feeds" : [
       {
          "username" : "bob",
          "readed" : 0
       },
       {
          "username" : "john",
          "readed" : 1
       },
    ]
}

目前,我使用更新来执行此操作:

db.account.update({username: 'foo'}, 
                  {$addToSet: {feeds: {username: 'john', readed: 0}}})

但我像这样重复:

   "feeds" : [
       {
          "username" : "bob",
          "readed" : 0
       },
       {
          "username" : "john", <--- NOT WANTED
          "readed" : 0
       },
       {
          "username" : "john",
          "readed" : 1
       },
    ]

如果新字段不存在,如何创建新字段?

2 个答案:

答案 0 :(得分:1)

你不能这样做。在Mongo的眼中:

{username: "john", readed: 1}

{username: "john", readed: 0}

不一样,因此$addToSet不会合并它们。

答案 1 :(得分:1)

在您的情况下,由于您不希望使用最新值更新readed字段,您确实可以在单个查询中执行此操作,但$ne通常使用效率不高

db.account.update({username: "foo","feeds.username":{"$ne":"john"}}, {"$push":{feeds:{username:"john","readed":0}}});

如果您想要使用最新值更新字段,这并非易事。 $不支持upsert。检查this issue。因此,您需要进行多个查询。