我是mongodb的新手,所以因为mongodb不完整的文档让我受到反复试验而感到压力......遗憾的是,我所有的尝试都没有错误,让我对发生的事情和调试内容感到困惑。 ..
我只需更新符合特定条件的数据库上的多条记录,并为非现有记录创建新条目。我相信我可以使用update,upsert和multi进行单一数据库访问。以下是我的想法:
dbschema.Person.update( { person_id: { $in: ["734533604" ,"701084015"] } }, { $set: {"scores": 1200} }, { options: { upsert: true, multi: true } } );
我也尝试了多种组合甚至旧版本,例如:
dbschema.Person.update( { person_id: { $in: ["734533604" ,"701084015"] } }, { $set: {"scores": 1200} }, { upsert: true }, { multi: true } );
它们都不起作用......
请帮我解决这个如此微不足道的事情......我可以轻松地在sql中做到这一点,但是nosql thingy是如此限制我..谢谢!
编辑:
查找相同的查询完美无缺:
dbschema.Person.find( { person_id: { $in: ["734533604" ,"701084015"] } }, function ( err, results ) {
console.log( 'result: ' + results );
console.log( 'error: ' + err );
console.log( 'result length: ' + results.length );
} );
编辑:
我希望创建“未找到”记录,并找到要更新的记录。我的逻辑可能有缺陷,现在我很困惑。
最初,我发现() - 一次记录一条记录,更改值,并为每个修改过的记录调用save(),但是当我部署到live时,响应时间变得慢几百倍当每个请求都有几百条记录需要更新时。
然后我发现find()+ $ in,并且性能恢复甚至比之前(查询时)更好,但更新仍然慢得令人无法接受。因此,现在我正在寻找更新所有文档的方法一个查询..
我通常在SQL中做的是使用UPDATE WHEN CASE THEN ...例如:
UPDATE person SET score = CASE
WHEN person_id = "734533604" THEN 1200
WHEN person_id = "701084015" THEN 1200
ELSE
score
END
答案 0 :(得分:6)
您不能根据不同的标准更新多个记录,并期望“upsert”来弄清楚您的意思。 Upsert标志最多可以插入一个文档,如果你查看文档,你会发现在upsert情况下有一个“复合”标准进行更新是没有意义的。
在您的示例中,插入使用哪两个fbid值?
我认为在您的情况下,您可以采取多种方法(所有方法都涉及多个操作)。您可以在为每个fbid值调用更新一次的循环中使用upsert标志进行更新 - 这将像您期望的那样工作,如果找不到fbid,将创建一个新文档。其他方式涉及在运行更新之前查询,但我认为这些方式可能更容易出现竞争条件。
以下是更新如何工作的说明 - 我发现它非常完整: http://docs.mongodb.org/manual/core/update/#update-operations-with-the-upsert-flag