MongoDB只更新几条记录,创建一个新属性,赋值

时间:2017-05-09 19:18:36

标签: mongodb mongoose

我很幸运在其他地方找到任何帮助。

基本上我只想更新那些没有给定属性的文档。

更新的值来自文档中已有的字段。

这是我尝试过的,但它并不喜欢文件中已有的字段""部分。说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多个文档。

3 个答案:

答案 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"); }
    });
});