使用变量作为mongodb中的键名与修饰符

时间:2015-01-25 11:44:56

标签: node.js mongodb

我正在尝试将一堆数组插入到mongoDB中。

数据类似于:

var places = {
    city: ['london', 'york', 'liverpool'],
    country: ['uk', 'france']
};

每次添加数组时,有些条目可能已存在,所以我想确保没有重复项。

db.collection('places').ensureIndex({'city': 1}, {unique: true }, function(){ });
db.collection('places').ensureIndex({'country': 1}, {unique: true }, function(){ });

然后我需要遍历places对象并添加每个项目:

for(var key in places){

    db.collection('places').update({_id: 1}, { $addToSet: { key: { $each places[key] } } }, function(err, docs){
        if(err){
            console.log(err);
        }else{
            console.log('success');
        }
    });

}

在这里,我需要密钥才能成为实际的密钥:'city','country'。而不是字面意义上的“关键”。但我不知道如何使用修饰符来实现这一目标。

1 个答案:

答案 0 :(得分:2)

您需要以编程方式构建$addToSet值:

for(var key in places){
    var addToSet = {};
    addToSet[key] = { $each: places[key] };
    db.collection('places').update({_id: 1}, {$addToSet: addToSet}, function(err, docs){
        if(err){
            console.log(err);
        }else{
            console.log('success');
        }
    });
}

但是,通过将两个更新合并为一个,您可以更有效地完成此任务:

var addToSet = {};
for(var key in places){
    addToSet[key] = { $each: places[key] };
}
db.collection('places').update({_id: 1}, {$addToSet: addToSet}, function(err, docs){
    if(err){
        console.log(err);
    }else{
        console.log('success');
    }
});