当前位置: 首页 > 知识库问答 >
问题:

替代$addToset处理数组中的元素(而不是作为一个整体处理数组)

邹麻雀
2023-03-14
{
        "_id" : {
                "id" : "ID1",
                "type" : "TYPE1"
        },
        "attrs" : [
                {
                        "name" : "ATTR1",
                        "value" : "foo"
                },
                {
                        "name" : "ATTR2",
                        "type" : "bar"
                },
                ...
                {
                        "name" : "ATTRn",
                        "value" : "blabla"
                }
        ]
}
db.runCommand({aggregate: "col", pipeline: [ {$group: {_id: "$_id.type", attr: {$addToSet: "$attrs.name"}} }]})
{
        "result" : [
                {
                        "_id" : "TYPE1",
                        "attr" : [
                                [
                                        "ATTR1",
                                        "ATTR2",
                                        "ATTR3"
                                ],
                                [
                                        "ATTR4",
                                        "ATTR5"
                                ]
                        ]
                },
                ...                    
        ],
        "ok" : 1
}

问题是,$addToset在添加数组元素时不能逐个处理元素。相反,它将整个数组视为一个单独的元素。因此,在最后,我得到的是一个“数组数组”,而我希望得到的是如下所示:

{
        "result" : [
                {
                        "_id" : "TYPE1",
                        "attr" : [

                                    "ATTR1",
                                    "ATTR2",
                                    "ATTR3",                                 
                                    "ATTR4",
                                    "ATTR5"
                        ]
                },
                ...                    
        ],
        "ok" : 1
}

为了得到这个结果,上述查询应该如何重新制定?

共有1个答案

钱黎明
2023-03-14

在分组之前,您需要$展开attrs数组:

javascript prettyprint-override">db.col.aggregate([
    {$unwind: '$attrs'},
    {$group: {_id: "$_id.type", attr: {$addToSet: "$attrs.name"}} }
])

产出:

{
    "result" : [ 
        {
            "_id" : "TYPE1",
            "attr" : [ 
                "ATTRn", 
                "ATTR2", 
                "ATTR1"
            ]
        }
    ],
    "ok" : 1
}

$unwind重复每个文档,每个attr元素重复一次。

 类似资料:
  • 本文向大家介绍jQuery数组处理函数整理,包括了jQuery数组处理函数整理的使用技巧和注意事项,需要的朋友参考一下 写在前面: jQuery的数组处理函数整理如下,如有补充和建议,欢迎评论交流~   1、$.trim(value)  从value中删除任何前导或尾随的空白字符   2、$.each(container, callback(key,value))  对container的每一项进

  • 本文向大家介绍php array_walk_recursive 使用自定的函数处理数组中的每一个元素,包括了php array_walk_recursive 使用自定的函数处理数组中的每一个元素的使用技巧和注意事项,需要的朋友参考一下 array_walk_recursive 对数组中的每个成员递归地应用用户函数 基本语法 bool array_walk_recursive ( array &$i

  • 出于某种原因,将索引放入XPath将返回整个对象数组,而不是索引处的对象数组 超文本标记语言 我正在研究的超文本标记语言如下所示: HTML的屏幕截图 我想做什么 我正试图根据复选框编写硒测试。选中叶复选框只应选中该叶复选框,选中父复选框还应选中子复选框。 我的XPath选择器 在该代码中,为了便于XPath选择器的编写,我在开发人员控制台中的一个字段上放置了一个ID。尤其是这个: 在包含所需内容

  • 问题内容: 函数应基于行名(在本例中为第2列)选择表中的行。它应该能够使用单个名称或名称列表作为参数并正确处理它们。 这就是我现在所拥有的,但是理想情况下不会有重复的代码,并且会聪明地使用诸如异常之类的东西来选择正确的方式来处理输入参数: 问题答案: 实际上,我同意AndrewHare的回答,只需传递一个包含单个元素的列表即可。 我会这样做: 并期望该参数将始终是一个列表-即使它只是一个元素的列表

  • 哪个Java并发集合提供数组元素级锁定或数组元素的原子更新。我不想锁定整个数组。只有99%的读操作和1%的写操作。 在数组中写入时锁定可能会阻塞其他线程,这些线程甚至可能不会查看正在由阻塞线程更新的相同元素。

  • 问题内容: 在http://golang.org/doc/effective_go.html#arrays阅读了以下内容之后… 数组是值。将一个数组分配给另一个数组将复制所有元素。 特别是,如果将数组传递给函数,它将接收该数组的副本,而不是指向该数组的指针。 ......我希望在下面的代码是从不同的,和的是从不同的。有人可以解释一下下面的代码为什么会改组吗?我知道Go还是一门年轻的语言;也许对数组