MongoDB:在upsert时只查找插入的项目

时间:2014-02-08 21:02:57

标签: node.js mongodb node-mongodb-native

我尝试定期从多个端点获取提要并循环这些批处理项并使用upsert进行更新:true。

对于每件商品,我都会检查商品的网址

如果它已经在myCollection中,它会更新“end_date”

如果它是新的,它将使用$ setOnInsert

插入myCollection并使用“start_date”

我的问题是:如何在myCollection的upsert中只插入项目?

我试过findAll $ where start_date = end_date但$setOnInsert: { start_date: end_date }没有使两个日期完全相同。而且这个解决方案效率不高,即使它像我从早期的问题中看到的那样有效。寻找最佳实践。谢谢!

这是我的代码:

var now = new Date(); ///???????? I thought this was cached?? 
for (var i = batch.length - 1; i >= 0; i--) {
        batch[i].end_date = now;
        myCollection.update({'url': batch[i].url}, {$setOnInsert: { start_date: batch[i].end_date }, $set: batch[i]}, {safe:true, upsert : true}, function(err, result) { 
            if(err) { console.log(err); return; }
            console.log(result); //result doesn't give any clue about inserts
        });

3 个答案:

答案 0 :(得分:1)

以前的答案对我有帮助,但我正在寻找的确切答案是在更新回调中传递更多参数,如下所示:

myCollection.update(..., {upsert : true}, function(err, numberAffected, raw) {
    console.log(raw);

}):

如果更新是插入,则从raw.upserted updatedExisting: false, upserted: 52f6b9756268a019bd11d0fb,获取项目的_id

价:

https://groups.google.com/d/msg/mongoose-orm/ehZ11QY-OUw/-ex7ekL2c9sJ https://github.com/mafintosh/mongojs/issues/39

答案 1 :(得分:0)

在upsert操作之后的

GetLastError应该提供有关它是否已插入或更新的详细信息。如果您使用的驱动程序/框架没有公开这些值,我建议向维护者提出请求。

答案 2 :(得分:0)

您要查找的结构是getLastError,其中插入的对象ID将在其中一个字段中返回。所有这些都取决于您正在进行的操作。

对于节点本机驱动程序,该函数的文档为here。大多数驱动程序由MongoDB工作人员维护,因此他们肯定符合标准。