mongodb findAndModify数组中的更新元素

时间:2016-04-25 06:30:25

标签: mongodb

有一份bson文件:

{
    "_id" : ObjectId("5718441f5116a60b08000b8c"),
    "mails" : [
        {
            "id" : 2,
            "a" : [
                {
                    "a" : 1
                },
                {
                    "a" : 2
                }
            ]
        },
        {
            "id" : 1,
            "a" : [
                {
                    "a" : 1
                },
                {
                    "a" : 2
                }
            ]
        }
    ]
}

我需要返回并清除属于给定文档的“mails.id == x”的数组“a”。所以我使用findAndModify,如:

db.mail.findAndModify({query: {"_id":ObjectId("5718441f5116a60b08000b8c")}, update: {$set:{"mails.$.a":[]}}, new: false, fields:{"mails":{$elemMatch:{"id":1}}}})

然而这不起作用。问题是$ set应该应用于数组中的一个文档而不是整个文档。所以我需要一个投影来预测它。

如果我将更新保留为空白,则会返回所需的部分:

{
    "_id" : ObjectId("5718441f5116a60b08000b8c"),
    "mails" : [
        {
            "id" : 1,
            "a" : [
                {
                    "a" : 1
                },
                {
                    "a" : 2
                }
            ]
        }
    ]
}

但我不知道如何清除'邮件'中的数组'a'

1 个答案:

答案 0 :(得分:1)

您必须在查询中指定数组元素匹配:

db.mail.findAndModify({query:{“_ id”:ObjectId(“5718441f5116a60b08000b8c”),“邮件”:{$ elemMatch:{“id”:1}} },更新:{$ set:{“mails。$。a”:[]}},new:false,fields:{“mails”:{$ elemMatch:{“id”:1}}}})

更新中的

new: false与文档中第一个匹配的元素匹配,因此您必须在查询中匹配它。此外,此查询将更新文档,但它将返回旧版本,因为您使用true,如果您想要将更新版本设置为var fs = require('fs'); var ncp = require('ncp').ncp; ncp.limit = 16; fs.readdir(__dirname, function(err, files) { for (var i = 0; i < files.length; i++) { ncp(files[i], 'C:/Users/User/Desktop/output', function(err) { if (err) { return console.error(err); } console.log('done!'); }); } });