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

Zen*_*aro 3 mongoose mongodb nosql

我是mongodb的新手,所以因为mongodb不完整的文档而让我感到压力,因为我没有错误,所以我的所有尝试都无法正常工作,让我对发生的事情和调试内容感到困惑......

我只需更新符合特定条件的数据库上的多条记录,并为非现有记录创建新条目.我相信我可以使用update,upsert和multi进行单一数据库访问.这是我想出的:

dbschema.Person.update( { person_id: { $in: ["734533604" ,"701084015"] } }, { $set: {"scores": 1200} }, { options: { upsert: true, multi: true } } );
Run Code Online (Sandbox Code Playgroud)

我也尝试了多种组合甚至旧版本,例如:

dbschema.Person.update( { person_id: { $in: ["734533604" ,"701084015"] } }, { $set: {"scores": 1200} }, { upsert: true }, { multi: true } );
Run Code Online (Sandbox Code Playgroud)

它们都不起作用......

请帮助我这个如此微不足道的东西......我可以轻松地在sql中做到这一点,但是nosql thingy是如此限制我..谢谢!

编辑:

find上的相同查询完美无缺:

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 );
} );
Run Code Online (Sandbox Code Playgroud)

编辑:

我期待创建"未找到"记录,并找到要更新的记录.我的逻辑可能存在缺陷,现在我很困惑.

最初,我发现() - 一次记录一条记录,更改值,并为每个修改过的记录调用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
Run Code Online (Sandbox Code Playgroud)

Asy*_*sky 6

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

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

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

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