4

我是 mongodb 的新手,因此压力很大,因为 mongodb 的文档不完整,让我不得不反复试验......遗憾的是,我所有的尝试都没有成功,让我对正在发生的事情以及要调试的内容感到困惑......

我只需要更新数据库中匹配某些条件的多条记录,对于不存在的记录,为此创建新条目。我相信我可以通过带有更新、更新插入和多的单个数据库访问来做到这一点。这是我想出的:

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 的东西对我来说太有限了……谢谢!

编辑:

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

编辑:

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

最初,我是一次 find()-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
4

1 回答 1

7

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

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

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

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

于 2013-05-01T20:18:25.653 回答