Mongodb更新集合的数组字段内的子文档

时间:2014-05-18 12:03:37

标签: mongodb mongodb-query

我有像

这样的mongodb集合
{
"_id" : ObjectId("5375ef2153bb790b20d8a660"),
"association" : [
    {
        "count" : 3,
        "name" : "hayatdediğin"
    },
    {
        "count" : 2,
        "name" : "sadecesenolsan"
    },
    {
        "count" : 2,
        "name" : "üslupnamustur"
    }
],
"tag_count" : 4,
"tag_name" : "vazgeçilmezolan",
"variation" : [
    {
        "count" : 4,
        "name" : "VazgeçilmezOlan"
    }
]
}

每个集合由tag_name,tag_count,数组字段关联和数组字段变体组成。对于关联内的每个名称,存在与此文档相同的不同文档。我需要在每个关联字典中添加新字段“total_count”,其值等于通过查询数据库的名称的tag_count。

我尝试了这段代码,但它无效

db.hashtag.find().forEach(function (doc) {
    if (doc.association.length != 0 ) {  
        doc.association.forEach(function (assoc) {
            db.hashtag.find({'tag_name': assoc.name}).forEach(function(tag){
                assoc.total_count=tag.tag_count;
        })

        });
    }
});

3 个答案:

答案 0 :(得分:1)

修改每个doc后,您需要在集合上调用save以提交更改。

假设您在shell中执行此操作:

db.hashtag.find().forEach(function (doc) {
    if (doc.association.length != 0 ) {  
        doc.association.forEach(function (assoc) {
            db.hashtag.find({'tag_name': assoc.name}).forEach(function(tag){
                assoc.total_count=tag.tag_count;
            });
        });
        // Save the changed doc back to the collection
        db.hashtag.save(doc);
    }
});

答案 1 :(得分:0)

要更新数据库中的doc,您必须使用db.hashtag.update,而不是db.hashtag.find。查找仅从db中检索文档。

答案 2 :(得分:0)

我使用forEach更改了以前的循环方法,然后最后保存了doc,代码也运行了。

db.hashtag.find().forEach(function (doc) {

    var array = doc.association;
    if (array != undefined){
        for(var i=0;i<array.length;i++)
        {
            var obj  = db.hashtag.findOne({'name':array[i].name});
            var count = obj.count;

            doc.association[i].total_count = count;

            db.hashtag.save(doc);
        }
    }
});