在使用组时,我需要很少的值来通过管道(无需更改)到后续管道聚合器
例如,如果我的输入是
{“_ id”:1,“tags”:[“a”,“b”,“b”,“c”],“text”:“a”},{“_ id”:2,“tags”: [“a”,“c”],“text”:“b”}
我喜欢输出
{_ id:1,标签:[a,b,c],文字:a},{_ id:2,标签:[a,c],文字:b}
我做了一个放松和组,并做$ addToSet删除重复 . 我的问题是如何制作
text
按原样出现在输出中 . 文本键和值只需要通过这个管道,但我被迫使用累加器
到目前为止我尝试过这段代码
使用test var unwind = {$ unwind:“$ tags”}; var group = {$ group:{_ id:“$ _id”,tags:{$ addToSet:“$ tags”},text:{$ first:“$ text”}}}; db.test.aggregate(退绕,基团)
它工作正常,但这不是$ first的意图,建议与sort一起使用 . 这样做的正确方法是什么?
2 回答
使用
$first
没有任何问题 . 作为替代方案,您可以将text
添加到_id
,但's hardly better as then you'd需要在管道末尾添加$project
以将其移回_id
.你必须使用SQL group bys做同样的轻微尴尬的事情 .
除
_id
字段之外的所有字段必须使用$group
的累加器,如$group documentation page中所指定 . 问题是,由于MongoDB无法知道该字段的值对于您正在组合在一起的所有文档的相同性,因此不清楚"pass"通过管道的值是什么意思$group
. 您必须使用累加器为该字段选择所需的值 .