Meteor upsert - 使用addToSet和每个

时间:2013-11-21 20:32:04

标签: mongodb meteor

我有一个Groups集合,其中包含eventId和guest虚拟机ID数组。我正在尝试使用upsert来检查eventId和当前guest虚拟机ID是否已经存在,如果是,则更新集合,并将新guest虚拟机ID推送到guests数组,否则将新集合与当前guest虚拟机和新guest虚拟机一起插入。这是我的upsert代码:

        var groupId = Groups.upsert({
          $and:[
          {eventId:groupAttributes.eventId}, // find all the Groups associated w/ this event
          { "guests": {$in: [guest]}}, // and include this guest
          ]
        },{$set: group, 
          $addToSet: {guests: {$each: [ guest, groupAttributes.guest ]}  }
        });

实际发生的是每次创建一个新的组,这是因为$ each修饰符不允许$ addToSet向数组添加多个值,如此处所述http://docs.mongodb.org/manual/reference/operator/update/addToSet/#up._S_addToSet

相反,guest数组中添加了一个大小为2的“$ each”数组。

[{"$each":["yQZfEXfs7J9E4Nbqf","s2rk5KAxq4dYtDFNG"]}]

两个问题。 1)有没有更好的方法来做我想做的事情,如果没有2)我做错了什么?感谢。

修改:在meteor mongo中尝试以下代码

db.groups.update({
          $and:[
          {eventId:"wGMhaP7t4nsiTNHt5"},
          { "guests": {$in: ["yQZfEXfs7J9E4Nbqf"]}},
          ]
        },{$set: { userId: 'gBuR448nsJMcpwjsT',
  author: 'Martin W',
  weddingId: 'rz9xjtDm3bFAeiCxM',  
  eventId: 'wGMhaP7t4nsiTNHt5' }, 
          $addToSet: {guests: {$each: [ "yQZfEXfs7J9E4Nbqf","s2rk5KAxq4dYtDFNG" ]}  }
        }, {upsert: true})

结果如下

{ "_id" : ObjectId("528fa31a098141f336688d96"), "author" : "Martin W", "eventId"
 : "wGMhaP7t4nsiTNHt5", "guests" : [  "yQZfEXfs7J9E4Nbqf",  "s2rk5KAxq4dYtDFNG"
], "userId" : "gBuR448nsJMcpwjsT", "weddingId" : "rz9xjtDm3bFAeiCxM" }

现在我在Meteor中尝试相同的代码

var groupId = Groups.update({
          $and:[
          {eventId:"wGMhaP7t4nsiTNHt5"},
          { "guests": {$in: ["yQZfEXfs7J9E4Nbqf"]}},
          ]
        },{$set: { userId: 'gBuR448nsJMcpwjsT',
  author: 'Martin W',
  weddingId: 'rz9xjtDm3bFAeiCxM',  
  eventId: 'wGMhaP7t4nsiTNHt5' }, 
          $addToSet: {guests: {$each: [ "yQZfEXfs7J9E4Nbqf","s2rk5KAxq4dYtDFNG" ]}  }
        }, {upsert: true})

结果不同(且不合需要)

{ "_id" : "4XgaF6pBGEohQR6pa", "userId" : "gBuR448nsJMcpwjsT", "author" : "Marti
n W", "weddingId" : "rz9xjtDm3bFAeiCxM", "eventId" : "wGMhaP7t4nsiTNHt5", "guest
s" : [  {  "$each" : [  "yQZfEXfs7J9E4Nbqf",  "s2rk5KAxq4dYtDFNG" ] } ] }

我是一个mongo newb,所以我不知道该怎么做,但我注意到_id在第一个结果中是一个ObjectId,而不是在第二个结果中。来宾数组是我期望使用meteor mongo的方式,但在第二个结果集中使用$ each作为值。有什么想法吗?

0 个答案:

没有答案