使用 upsert 和多语法更新 Mongodb

标签 mongodb mongoose nosql

我是 mongodb 的新手,由于 mongodb 的不完整文档让我反复试验,所以压力很大......遗憾的是,我所有的尝试都没有成功,让我对发生的事情和调试的内容感到困惑。 ..

我只需要更新数据库中符合特定条件的多个记录,并为不存在的记录创建新条目。我相信我可以通过更新、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 的东西对我来说太有限了..谢谢!

编辑:

查找上的相同查询完美运行:

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 );
} );

编辑:

我希望创建“未找到”记录,并更新找到的记录。我的逻辑可能有缺陷,我现在很困惑。

最初,我一次查找()-ing 一条记录,更改值,并为每条修改的记录调用 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

最佳答案

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

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

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

这里是更新如何工作的解释——我觉得它很完整: http://docs.mongodb.org/manual/core/update/#update-operations-with-the-upsert-flag

关于使用 upsert 和多语法更新 Mongodb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45010633/

相关文章:

mongodb - 没有重复的 Mongoose 帖子

node.js - TypeError : Cannot read property 'ref' of undefined | Express

json - : cannot use the part to traverse the element更新时Mongo报错

database - Cloudant 查询错误 : missing search index when trying to sort

c# - SQL Server 与 MongoDB : Speed test?

mongodb - GNU AGPL v3.0(MongoDB)将在商业产品上发布

mongodb - 我可以从 MongoDB 时间戳中获得更大的粒度吗?

javascript - 当用 sinon.js stub Mongoose 时,为什么我得到 "TypeError: Cannot read property ' 恢复'未定义'

php - Solr:检查文档是否存在而不检索文档

MongoDB固定大小数组实现