使用upsert和多语法进行Mongodb更新

时间:2013-05-01 16:58:10

标签: mongodb mongoose nosql

我是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

1 个答案:

答案 0 :(得分:6)

您不能根据不同的标准更新多个记录,并期望“upsert”来弄清楚您的意思。 Upsert标志最多可以插入一个文档,如果你查看文档,你会发现在upsert情况下有一个“复合”标准进行更新是没有意义的。

在您的示例中,插入使用哪两个fbid值?

我认为在您的情况下,您可以采取多种方法(所有方法都涉及多个操作)。您可以在为每个fbid值调用更新一次的循环中使用upsert标志进行更新 - 这将像您期望的那样工作,如果找不到fbid,将创建一个新文档。其他方式涉及在运行更新之前查询,但我认为这些方式可能更容易出现竞争条件。

以下是更新如何工作的说明 - 我发现它非常完整: http://docs.mongodb.org/manual/core/update/#update-operations-with-the-upsert-flag