如何通过子集合中的字段查找和分组?

时间:2014-09-16 08:28:06

标签: node.js mongodb mongodb-query aggregation-framework

收集:

[{
    _id: "Jon"
    gender: "male",
    sockets: [
        { code: 12345, type: 'default' },
        { code: 67891, type: 'special' }
    ]
},
{
    _id: "Jane"
    gender: "female",
    sockets: [
        { code: 445566, type: 'very_special' },
        { code: 223388, type: 'extra_special' }
    ]
}]

我想搜索代码字段。因此,用户开始键入代码,应该使用找到的代码进行建议。例如。输入 1 时,结果应为

[{ 
    _id: "Jon", code: 12345
}, {
    _id: "Jon", code: 67891
}]

我知道我必须使用聚合和分组。但我找不到任何示例如何为我的用例这样做。如果我按标准字段分组,我会使用它。但这不适用于像套接字这样的子集合:

collection.aggregate([{
    $group: {
       _id: "$code"
    }
}]);

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

当你处理"数组"在聚合框架中,您通常首先想要$unwind。这有效地使#e; de-normalizes"将您的文档分成每个数组条目的单独文档。

另一件事就是"分组"你可能想要的是_id可以包含" group"而不仅仅是一个字段值。可能与此示例中仅处理$unwind没有区别,但对于$group的应用程序,您可以这样做:

db.collection.aggregate([
    { "$unwind": "$sockets" },
    { "$group": {
        "_id": { "_id": "$_id", "code": "$sockets.code" }
    }}
])

一般来说,你真的很想" group"关于某事,但也许你只是想要"去标准化"表单,您也可以使用$project

db.collection.aggregate([
    { "$unwind": "$sockets" },
    { "$project": {
        "_id": 1,
        "code": "$sockets.code"
    }}
])