问题陈述
尽管在“上使用唯一键创建集合” uid”和“sid”字段,重复文档仍在插入到集合中。
技术细节
使用的索引创建命令:
db.user_services.createIndex({"uid":1 , "sid": 1},{unique:true,dropDups: true})
原因
由于集合中存在重复文档,索引创建失败。在 MongoDB 3.0.0 版本中,“dropDups”选项无法正常运行,导致此问题。
解决方案
db.events.aggregate([ { "$group": { "_id": { "uid": "$uid", "sid": "$sid" }, "dups": { "$push": "$_id" }, "count": { "$sum": 1 } }}, { "$match": { "count": { "$gt": 1 } }} ]).forEach(function(doc) { doc.dups.shift(); db.events.remove({ "_id": {"$in": doc.dups }}); });
db.events.createIndex({"uid":1 , "sid": 1},{unique:true})
Upsert 操作
对于问题的第二部分,根据现有数据的存在来实现插入或更新文档的所需行为,使用带有“upsert”选项的“.update()”方法:
$collection->update( array( "uid" => 1, "sid" => 1 ), array( '$set' => $someData ), array( 'upsert' => true ) );
这将修改找到的文档并根据需要插入新文档。此外,您可以使用“$setOnInsert”来指定仅应在文档插入期间设置的字段。
以上是为什么即使在使用“dropDups”创建唯一键后,我的 MongoDB 集合中仍会出现重复文档?的详细内容。更多信息请关注PHP中文网其他相关文章!