我很幸运在其他地方找到任何帮助。
基本上我只想更新那些没有给定属性的文档。
更新的值来自文档中已有的字段。
这是我尝试过的,但它并不喜欢文件中已有的字段""部分。说Cn doesn't exist.
db.getCollection('test').update(
// query
{ "id2" : { $exists: false } },
// update
{ id2: Cn },
// options
{
"multi" : true, // update all documents
"upsert" : false // don't insert new documents
}
);
这是我的测试数据
/* 1 */
{
"_id" : ObjectId("5912132c4a58677726d37168"),
"Cn" : "CA",
"id2" : "CAAB",
"Prov" : "AB"
}
/* 2 */
{
"_id" : ObjectId("591213404a58677726d37172"),
"Cn" : "CA",
"id2" : "CANZ",
"Prov" : "NZ"
}
/* 3 */
{
"_id" : ObjectId("591213534a58677726d37180"),
"Cn" : "CA",
"id2" : "CAMB",
"Prov" : "MB"
}
/* 4 */
{
"_id" : ObjectId("591213674a58677726d3718c"),
"Cn" : "US"
}
/* 5 */
{
"_id" : ObjectId("591213894a58677726d371a3"),
"Cn" : "MX"
}
所有这一切应该是在美国和美国创建一个id2
。 MX并为这些新的id2
属性提供相应的值' US' &安培; ' MX'
这不是什么大问题,但我有144个国家和地区。要添加id2
的10,000多个文档。
答案 0 :(得分:0)
你可以试试这个:
db.your_collection.aggregate( [
{ $match : { id2 : { $exists: false }}},
{ $addFields: {
id2 : "$Cn"
}
},
{ $out : "your_collection" }
]);
这将删除集合中包含id2字段的所有文档。
你可以用更长的方式在猫鼬中做到这一点:
db.getCollection('test').find({ "id2" : { $exists: false } }, function(err, docs){
if(err){
//handle errror
}
else if(!docs){
// no docs found
}
else{
for(var i=0; i< docs.length; i++){
db.getCollection('test')
.findByIdAndUpdate(
docs[i]._id
, { $set : { id2 : docs[i].Cn}}
, { new : true}
, function(err, doc){
if(err){
//handle error
}
else{
//doc was updated
}
});
}
}
});
答案 1 :(得分:0)
您无法使用仅包含表达式的运算符更新多个项目,并且自我引用也无法正常工作。
查看此问题,了解解决方案,以获得您需要完成的工作:Update MongoDB field using value of another field
答案 2 :(得分:0)
如果没有 Mihir Bhende
推送,我就不会这样做。谢谢你。
var c = db.getCollection('test').find(
{ "id2" : { $exists: false }}
);
c.forEach(function(myDoc) {
print("doc", myDoc.Cn);
db.getCollection('test').update( {_id: myDoc._id}, {$set: { "id2": myDoc.Cn }}, function (err) {
if (err) { print("err"); }
});
});