Node.js 和 MongoDB 如果存在文档完全匹配,则忽略插入
Posted
技术标签:
【中文标题】Node.js 和 MongoDB 如果存在文档完全匹配,则忽略插入【英文标题】:Node.js and MongoDB if document exact match exists, ignore insert 【发布时间】:2014-10-30 21:29:46 【问题描述】:我正在维护一个唯一值的集合,该集合具有一个包含这些值实例的伴随集合。我这样做的原因是伴随集合有超过 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"
]
编辑 我尝试在该字段上创建一个唯一索引,但是一旦它在我插入的文档数组中找到重复项,它就会停止整个过程并且在中断后不会继续检查任何值。
【问题讨论】:
【参考方案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)
【讨论】:
【参考方案2】:好吧,如果我正确理解您的问题,我认为这里的解决方案非常简单。 由于该过程在发现重复字段时会停止,因此您基本上应该在尝试添加之前检查该值是否不存在。
因此,对于uniqueValues
中的每个元素,进行find/findOne 查询,如果没有返回任何结果,则添加该元素,否则不要。
【讨论】:
这是一个明显的选择,但是执行 forEach 或循环通过可能的 500k 文档上传(大型 csv)似乎是一个可怕的选择。在这 50 万个中,可能有 2 万个我尚未从其他上传中积累的唯一值。我看过一些关于 continueOnError 标志的帖子,但我无法让它在 shell 中工作。以上是关于Node.js 和 MongoDB 如果存在文档完全匹配,则忽略插入的主要内容,如果未能解决你的问题,请参考以下文章
Node.Js-如果在MongoDB中找不到匹配的文档,则返回1
使用 Mongoose 的 Node.js 和 MongoDB。无法使用 findByIdAndUpdate 增加文档版本
使用 Mongoose 的 Node.js 和 MongoDB。无法使用 findByIdAndUpdate 增加文档版本