查询以返回展平的嵌入字段

时间:2016-11-30 11:06:37

标签: mongodb mongodb-query

我一直在寻找答案,但无法在任何地方找到答案。

当我在robomongo中使用以下方法来检索符合条件的文档的嵌入字段时,我得到一个列表所有匹配的文档。 所有这些文档都包含我选择的嵌入字段的文档数组。

db.getCollection('test').find(
    { "bom.COMPONENT": "101-00001-017" },
    { _id: 0, "CicodeList.Cicode": 1 }
)

结果

/* 1 */
{
    "CicodeList" : [ 
        {
            "Cicode" : "one"
        }
    ]
}

/* 2 */
{
    "CicodeList" : [ 
        {
            "Cicode" : "two"
        }
    ]
}

/* 3 */
{
    "CicodeList" : [ 
        {
            "Cicode" : "three"
        }
    ]
}

我想得到的是一个包含所有文档的所有嵌入字段的单个数组,如下所示:

{ results: ["one", "two", "three"] }

原始文件看起来有点像这样

/* 1 */
{
    "_id" : ObjectId("583df12093181938d03c50eb"),
    "CicodeList" : [ 
        {
            "Cicode" : "one"
        }, 
        {
            "Cicode" : "two"
        }
    ],
    "bom" : [ 
        {
            "COMPONENT" : "101-00001-017"
        }, 
        {
            "COMPONENT" : "101-00008-002"
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("583df12193181938d03c50ec"),
    "CicodeList" : [ 
        {
            "Cicode" : "three"
        }, 
        {
            "Cicode" : "four"
        }
    ],
    "bom" : [ 
        {
            "COMPONENT" : "101-00001-017"
        }, 
        {
            "COMPONENT" : "101-00008-002"
        }
    ]
}

2 个答案:

答案 0 :(得分:0)

我建议使用aggregation框架

的以下查询
db.test.aggregate([
    { 
        $match : { "bom.COMPONENT": "101-00001-017" }
    },
    {
        $unwind: {
            path: "$CicodeList"
        }
    }, 
    {
        $group: {
            "_id": null,
            "results": { $push: "$CicodeList.Cicode" } 
        }
    }
])

它会打印出所有已存在的Cicode值,因为“bom.COMPONENT”等于“101-00001-017”

{"results" : [ "one", "two", "three", "four" ]}

答案 1 :(得分:0)

您只需在嵌入字段上运行 distinct 方法,如下所示

db.getCollection('test').distinct("CicodeList.Cicode",
    { "bom.COMPONENT": "101-00001-017" } /* query */
)

<强>结果

/* 1 */
[
    "one",
    "two",
    "three"
]