Node.js和MongoDB如果存在文档完全匹配,则忽略insert

时间:2014-10-30 21:29:47

标签: node.js mongodb insert unique bulkinsert

我正在维护一组具有伴随集合的唯一值,该集合具有这些值的实例。我这样做的原因是伴侣集合具有> 1000万条记录,其中唯一值集合仅加起来达到100K并且我在整个地方使用这些值并进行部分匹配查找。

当我上传csv文件时,我一次插入伴随集合中的记录通常是10k到500k。仅将尚未存在的值插入唯一值集合的最佳方法是什么?

示例:

//Insert large quantities of objects into mongo
    var bulkInsert = [
        {
            name: "Some Name",
            other: "zxy",
            properties: "abc"
        },
        {
            name: "Some Name",
            other: "zxy",
            properties: "abc"
        },
        {
            name: "Other Name",
            other: "zxy",
            properties: "abc"
        }]
 //Need to insert only values that do not already exist in mongo unique values collection   
    var uniqueValues = [
        {
            name:"Some Name"
        },
        {
            name:"Other Name"
        }
    ]

修改 我尝试在字段上创建一个唯一索引,但是一旦它在我插入的文档数组中找到一个副本,它就会停止整个过程并且不会在中断后检查任何值。

2 个答案:

答案 0 :(得分:1)

想出来。如果从shell执行此操作,则需要使用Bulk()并创建如下的插入作业:

var bulk = db.collection.initializeUnorderedBulkOp();
bulk.insert( { name: "1234567890a"} );
bulk.insert( { name: "1234567890b"} );
bulk.insert( { name: "1234567890"} );
bulk.execute();

并且在节点中,continueOnError标志适用于直线collection.insert()

collection.insert( [{name:"1234567890a"},{name:"1234567890c"}],{continueOnError:true}, function(err, doc){}

答案 1 :(得分:0)

好吧,如果我理解你的问题,我认为这里的解决方案非常简单。 由于该过程在找到重复字段时停止,因此您应该在尝试添加之前检查该值是否已经存在。

因此,对于uniqueValues中的每个元素,创建 find / findOne 查询,如果它没有返回任何结果,则添加元素,否则不要