选择字段值位于某个数组中的子文档 [英] Select sub-documents where field's value is in an some array

查看:72
本文介绍了选择字段值位于某个数组中的子文档的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想根据子文档进行过滤,但实际上我在为每个子文档重复该文档.如果是这样,我需要一个文档和一个子文档列表.

I want to filter according the sub documents, but actually I am repeating the document for each sub document. I want one document and a list of sub documents if that is the case.

我的数据如下:

{
    "_id" : ObjectId("582eeb5f75f58055246bd22d"),
    "filename" : "file1",
    "cod" : NumberLong(90),
    "subdocs" : [
        {
            "length" : NumberLong(10),
            "desc" : "000"
        },
        {
            "length" : NumberLong(15),
            "desc" : "011"
        },
        {
            "length" : NumberLong(30),
            "desc" : "038"
        }
    ]
}
{
    "_id" : ObjectId("582eeb5f75f58055246bd22e"),
    "filename" : "file2",
    "cod" : NumberLong(95),
    "subdocs" : [
        {
            "length" : NumberLong(11),
            "desc" : "000"
        },
        {
            "length" : NumberLong(21),
            "desc" : "018"
        },
        {
            "length" : NumberLong(41),
            "desc" : "008"
        }
    ]
}

我正在使用此查询来过滤 subdocs

I am using this query to filter for the desc (000, 011) on the subdocs

db.ftmp.aggregate( 
    { $match: 
        { "subdocs.desc": 
            { $in: ["000", "011"] } 
        }
    }, 
    { $unwind : "$subdocs" }, 
    { $match : 
        { "subdocs.desc" : 
            { $in:["000", "011"] } 
        }
    }
)

但是结果显示3个文档,与该查询匹配的每个子文档1个文档.

But the result shows 3 documents, 1 document for each sub-document that matches with that query.

{
    "_id" : ObjectId("582eeb5f75f58055246bd22d"),
    "filename" : "file1",
    "cod" : NumberLong(90),
    "subdocs" : {
        "length" : NumberLong(10),
        "desc" : "000"
    }
}
{
    "_id" : ObjectId("582eeb5f75f58055246bd22d"),
    "filename" : "file1",
    "cod" : NumberLong(90),
    "subdocs" : {
        "length" : NumberLong(15),
        "desc" : "011"
    }
}
{
    "_id" : ObjectId("582eeb5f75f58055246bd22e"),
    "filename" : "file2",
    "cod" : NumberLong(95),
    "subdocs" : {
        "length" : NumberLong(11),
        "desc" : "000"
    }
}

但是我想得到:file1包含子文档desc 000和011,而file2包含子文档000

However I want to get: file1 with the subdocuments with desc 000 and 011, and file2 with the subdocumnt 000

{
    "_id" : ObjectId("582eeb5f75f58055246bd22d"),
    "filename" : "file1",
    "cod" : NumberLong(90),
    "subdocs" : [
        {
            "length" : NumberLong(10),
            "desc" : "000"
        },
        {
            "length" : NumberLong(15),
            "desc" : "011"
        }
    ]
}
{
    "_id" : ObjectId("582eeb5f75f58055246bd22e"),
    "filename" : "file2",
    "cod" : NumberLong(95),
    "subdocs" : {
        "length" : NumberLong(11),
        "desc" : "000"
    }
}

正确的方法是什么?有什么主意吗?

What is the correct way to do that? Any idea?

推荐答案

您只需要添加$ group&推.首先,您需要先展开子文档以应用$ match,然后在id上应用$ group,然后将分组的子文档推入$

You just need to add $group & $push. First you $unwind the subdocs to apply the $match followed by $group on id and $push the grouped subdocs.

db.ftmp.aggregate({
    $unwind: "$subdocs"
}, {
    $match: {
        "subdocs.desc": {
            $in: ["000", "011"]
        }
    }
}, {
    $group: {
        _id: "$_id",
        subdocs: {
            $push: "$subdocs"
        },
        filename: {
            $first: "$filename"
        },
        cod: {
            $first: "$cod"
        }
    }
})

这篇关于选择字段值位于某个数组中的子文档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆