db.collection.find returns addToSet 后多条记录

db.collection.find returns multiple records after addToSet

我使用addToSet命令(添加UpdatedData):

MyTable.update({ "UrlLink": "http://www.someurl.com"}, {
        $addToSet: {
            UpdatedData: {
                TheDate: ThisDate,
                NewInfo: ThisInfo
            }
        }
    },
        function (err, result) {
                next(err,result)
        }
);

但是,当我进行查询时(在 UpdatedData 添加到我的文档之后),我看到它 returns 两个文档。而不是只有一个更新 document:

db.MyTable.find( {"UrlLink": "http://www.someurl.com"})

{ "_id" : ObjectId("56485922143a886f66c2f8bb"), "UrlLink" : "http://www.someurl.com", "Stuff" : "One", "UpdatedData" : [ { "TheDate" : "11/15/2015", "NewInfo" : "Info1", "_id" : ObjectId("5648599a71efc79c660f76d3") } ] }
{ "_id" : ObjectId("5648599f71efc79c660f76d4"), "UrlLink" : "http://www.someurl.com", "Stuff": "One", "UpdatedData" : [ ] }

所以似乎 addToSet 使用新的 _id 创建了一个新文档,而不是更新旧记录 (ObjectId("5648599f71efc79c660f76d4"))。但我只在 robomongo (ObjectId("56485922143a886f66c2f8bb")) 中看到更新的文档。知道为什么会发生这种情况以及如何防止这种行为吗?

update 无法创建新文档,只能 update 存在。 看起来您创建了两个具有相同 url 的文档。然后当您更新它时,只更新第一个文档..

要防止创建一个已经存在的文档url,您可以创建一个索引并将其设置为唯一

db.collection.createIndex({ UrlLink: 1 }, { unique: true })

这将防止创建具有相同 url 的新文档,并且还会尽快通过 UrlLink 进行查询。