首页 文章

MongoDB聚合组

提问于
浏览
2

在使用组时,我需要很少的值来通过管道(无需更改)到后续管道聚合器

例如,如果我的输入是

{“_ 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 回答

  • 1

    使用 $first 没有任何问题 . 作为替代方案,您可以将 text 添加到 _id ,但's hardly better as then you'd需要在管道末尾添加 $project 以将其移回 _id .

    你必须使用SQL group bys做同样的轻微尴尬的事情 .

  • 0

    _id 字段之外的所有字段必须使用 $group 的累加器,如$group documentation page中所指定 . 问题是,由于MongoDB无法知道该字段的值对于您正在组合在一起的所有文档的相同性,因此不清楚"pass"通过管道的值是什么意思 $group . 您必须使用累加器为该字段选择所需的值 .

相关问题