Mongodb Meteor upsert-使用addToSet和每个
我有一个包含eventId和来宾ID数组的Groups集合。我正在尝试使用upsert检查eventId和当前来宾id是否已经存在,如果已经存在,则使用推送到来宾数组的新来宾id更新集合,否则使用当前来宾和新来宾插入新集合。这是我的上传代码:Mongodb Meteor upsert-使用addToSet和每个,mongodb,meteor,Mongodb,Meteor,我有一个包含eventId和来宾ID数组的Groups集合。我正在尝试使用upsert检查eventId和当前来宾id是否已经存在,如果已经存在,则使用推送到来宾数组的新来宾id更新集合,否则使用当前来宾和新来宾插入新集合。这是我的上传代码: var groupId = Groups.upsert({ $and:[ {eventId:groupAttributes.eventId}, // find all the Groups assoc
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向数组中添加多个值,如下所述
取而代之的是,来宾数组添加了一个大小为2的“$each”数组
[{"$each":["yQZfEXfs7J9E4Nbqf","s2rk5KAxq4dYtDFNG"]}]
两个问题。1) 有没有更好的方法来做我想做的事情,如果没有,我做错了什么?谢谢
编辑:在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})
结果是不同的(也是不可取的)
我是一个mongo新手,所以不确定该怎么做,但我注意到_id在第一个结果中是ObjectId,而不是在第二个结果中。来宾数组是我希望使用meteor mongo的方式,但是在第二个结果集中使用$each作为值。有什么想法吗?如果每次都插入一个新文档,那么您可能需要查看选择器。Upsert查找匹配的文档(由第一个参数定义),如果它们存在,它将修改它们,否则它将插入一个新文档。您是否验证了
groupAttributes.eventId
与现有文档匹配?你能到Mongo控制台运行选择器,看看它是否返回匹配结果吗?@BruceHubbard谢谢你的回答。我根据你的评论更新了我的答案。我确实验证了groupAttributes.eventId是否与现有文档匹配。所以这次,我在meteor mongo和meteor方法中使用了完全相同的mongo更新。你会注意到结果是不同的。有什么想法吗?看来这就是问题所在!看起来你必须手动完成,直到bug修复程序发布。是的。谢谢你的帮助。
{ "_id" : "4XgaF6pBGEohQR6pa", "userId" : "gBuR448nsJMcpwjsT", "author" : "Marti
n W", "weddingId" : "rz9xjtDm3bFAeiCxM", "eventId" : "wGMhaP7t4nsiTNHt5", "guest
s" : [ { "$each" : [ "yQZfEXfs7J9E4Nbqf", "s2rk5KAxq4dYtDFNG" ] } ] }