收集:
[{
_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"
}
}]);
有什么想法吗?
答案 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"
}}
])