如何清除 MongoDB 中的重复对象
How to purge duplicate objects from MongoDB
我的数据库中的一个对象内有一个数组,随着时间的推移会累积重复的对象(使用不可靠的 Instagram API 的缺点)。我试图定期清除这个重复项数组并将其替换为清理过的数组。我很难理解为什么我的节点服务器上的以下代码 运行 不起作用。 trimArray
函数完美运行,但我的 MongoDB 对象中的 'photos' 数组永远不会更新。
// Takes in an array and outputs an array with only unique objects
function trimArray(bloatedArray) {
var seen = {};
var trimmedArray = [];
var len = bloatedArray.length;
var j = 0;
for(var i = 0; i < len; i++) {
var imageLink = bloatedArray[i].link;
var image = bloatedArray[i];
if(seen[imageLink] !== 1) {
seen[imageLink] = 1;
trimmedArray[j++] = image;
}
}
return trimmedArray;
}
Event.find( { $and: [{latitude: latitude}, {radius: distance}] },
function(err,event){
if (err) {
} else {
var array = event[0].photos;
Event.update( { $and: [{latitude: latitude}, {radius: distance}] },
{ 'photos': trimArray(array) }
);
}
}
);
我认为更新只会更新现有记录,而不是删除它们。它在返回的数组中查找项目并相应地更新它们。如果你想使用你的 trimArray,你必须清空 collection 然后重新插入 trimArray 结果(糟糕的想法)。
相反,您应该正确设置 collection 以便首先不存储重复项。你会想建立一个唯一的索引,然后你永远不必清除。
db.things.ensureIndex({'photos.make_some_key' : 1}, {unique : true, dropDups : true})
我的数据库中的一个对象内有一个数组,随着时间的推移会累积重复的对象(使用不可靠的 Instagram API 的缺点)。我试图定期清除这个重复项数组并将其替换为清理过的数组。我很难理解为什么我的节点服务器上的以下代码 运行 不起作用。 trimArray
函数完美运行,但我的 MongoDB 对象中的 'photos' 数组永远不会更新。
// Takes in an array and outputs an array with only unique objects
function trimArray(bloatedArray) {
var seen = {};
var trimmedArray = [];
var len = bloatedArray.length;
var j = 0;
for(var i = 0; i < len; i++) {
var imageLink = bloatedArray[i].link;
var image = bloatedArray[i];
if(seen[imageLink] !== 1) {
seen[imageLink] = 1;
trimmedArray[j++] = image;
}
}
return trimmedArray;
}
Event.find( { $and: [{latitude: latitude}, {radius: distance}] },
function(err,event){
if (err) {
} else {
var array = event[0].photos;
Event.update( { $and: [{latitude: latitude}, {radius: distance}] },
{ 'photos': trimArray(array) }
);
}
}
);
我认为更新只会更新现有记录,而不是删除它们。它在返回的数组中查找项目并相应地更新它们。如果你想使用你的 trimArray,你必须清空 collection 然后重新插入 trimArray 结果(糟糕的想法)。
相反,您应该正确设置 collection 以便首先不存储重复项。你会想建立一个唯一的索引,然后你永远不必清除。
db.things.ensureIndex({'photos.make_some_key' : 1}, {unique : true, dropDups : true})