我有一个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作为值。有什么想法吗?