我有一个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 ]} }
});
实际发生的是每次创建一个新的组,它允许$ addToSet向数组添加多个值,如此处所述http://docs.mongodb.org/manual/reference/operator/update/addToSet/#up._S_addToSet
相反,guest数组中添加了一个大小为2的“$ each”数组 .
[{"$each":["yQZfEXfs7J9E4Nbqf","s2rk5KAxq4dYtDFNG"]}]
两个问题 . 1)有没有更好的方法来做我想做的事情,如果不是2)我做错了什么?谢谢 .
Edit :在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作为值 . 有任何想法吗?