在带有修饰符的 mongo db 中使用变量作为键名

use variable as key name in mongo db with modifier

我正在尝试将一堆数组插入 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'。而不是字面上的 'key'。但我看不出如何使用适当的修饰符来实现这一点。

您需要以编程方式建立您的 $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');
    }
});