如何从MongoDB中清除重复的对象

时间:2015-02-21 21:02:04

标签: javascript arrays node.js mongodb mongoose

我的数据库中的对象内部有一个数组,随着时间的推移积累了重复的对象(使用不可靠的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) }
            );
        }
    }
);

1 个答案:

答案 0 :(得分:1)

我认为更新只会更新现有记录,而不是删除它们。它在返回的数组中查找项目并相应地更新它们。如果你想使用你的trimArray,你必须清空该集合,然后重新插入trimArray结果(可怕的想法)。

相反,您应该正确设置集合,以便不首先存储重复项。您将要设置唯一索引,然后您永远不必清除。

See the docs for details

db.things.ensureIndex({'photos.make_some_key' : 1}, {unique : true, dropDups : true})