2013-05-01 121 views
2

我是新来的mongodb,所以强调出来,因为mongodb的不完整的文档留给我的试验和错误...可悲的是,我所有的尝试都没有工作没有错误,让我困惑什么正在发生什么调试......Mongodb更新与upsert和多语法

我只需要更新数据库上匹配特定条件的多个记录,并且为不存在的记录创建新条目。我相信我可以通过更新,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); 
}); 

编辑:

我期待的“未找到”的记录被创建,并且找到的记录是更新。我的逻辑可能有缺陷,现在我非常困惑。我最初一次发现()一条记录,更改值,并为每条修改的记录调用save(),但是当我部署到现场时,响应时间变为数百倍慢特别是当每个请求中有几百条记录需要更新时。

然后我发现find()+ $ in,并且性能得到恢复,甚至比以前更好(当查询时),但更新仍然令人无法接受地慢。因此,现在我正在寻找方法来更新所有文档在一个查询..

我通常做的SQL是使用更新时,CASE THEN ...如:

+0

它不可能 – 2013-05-01 18:02:36

+0

你有几个问题,一些是语法的但是其他的设计。如果您正在查找2条匹配的记录,并且没有找到,您是否期望两者都被创建?如果找到两个中的一个,你是否期望更新一个并创建一个? Upsert最多可以创建一条新记录,这就是为什么multi和upsert有时并不合理。 – 2013-05-01 20:10:38

+0

是的,我期待如果没有找到这两者,如果找到了,它会被更新,而那些没有被发现的东西被创建..你是对的,我很困惑,也许我的逻辑是有缺陷的以及..但我会解释为什么我试图这样做.. – Zennichimaro 2013-05-02 01:46:28

回答

5

根据不同的标准不能更新多条记录,并期望“更新插入”要弄清楚你是什​​么意思。 Upsert标志可以导致至多插入一个文档,如果您检查文档,您会发现在upsert的情况下更新“复合”标准是没有意义的。

在你的例子中,插入使用哪两个fbid值?

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

这里是一个更新是如何工作的解释 - 我觉得相当完整:使用UPSERT与$,因为UPSERT可以同时插入一个PERSONID和将第一和第二值之间的混淆 http://docs.mongodb.org/manual/core/update/#update-operations-with-the-upsert-flag

+1

谢谢,我期待更新或插入$ in中的所有记录。我不确定这是否是这样做的,因为我正试图优化许多插入/更新,这会消除我的响应时间。你有什么想法我可以插入/更新很多记录,并最好将它保存在一个镜头中? – Zennichimaro 2013-05-02 02:00:58

+0

如果我理解你的问题,那么没有办法做到这一点。 – 2013-05-02 16:00:38