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

返回子文档数组与用户定义数组的交集?

顾英发
2023-03-14

我正在尝试使用Mongo聚合框架来找出我文档中的数组和另一个用户定义的数组之间的交集。我没有得到正确的结果,我的猜测是因为我在数组中有数组。

这是我的数据集。

我的文档:

{
    "_id" : 1,
    "pendingEntries" : [ 
        {
            "entryID" : ObjectId("5701b4c3c6b126083332e65f"),
            "tags" : [ 
                {
                    "tagKey" : "owner",
                    "tagValue" : "john"
                }, 
                {
                    "tagKey" : "ErrorCode",
                    "tagValue" : "7001"
                }, 
                {
                    "tagKey" : "ErrorDescription",
                    "tagValue" : "error123"
                }
            ],
            "entryTime" : ISODate("2016-04-04T00:26:43.167Z")
        }
    ]
},

/* 1 */
{
    "_id" : 2,
    "pendingEntries" : [ 
        {
            "entryID" : ObjectId("5701b4c3c6b126083332e65d"),
            "tags" : [ 
                {
                    "tagKey" : "owner",
                    "tagValue" : "peter"
                }, 
                {
                    "tagKey" : "ErrorCode",
                    "tagValue" : "6001"
                }, 
                {
                    "tagKey" : "JIRA",
                    "tagValue" : "Oabc-123"
                }
            ],
            "entryTime" : ISODate("2016-04-04T00:26:43.167Z")
        }
    ]
},

/* 2 */
{
    "_id" : 3,
    "pendingEntries" : [ 
        {
            "entryID" : ObjectId("5701b4c3c6b126083332e65c"),
            "tags" : [ 
                {
                    "tagKey" : "owner",
                    "tagValue" : "abc"
                }, 
                {
                    "tagKey" : "ErrorCode",
                    "tagValue" : "6001"
                }, 
                {
                    "tagKey" : "JIRA",
                    "tagValue" : "abc-123"
                }
            ],
            "entryTime" : ISODate("2016-04-04T00:26:43.167Z")
        }
    ]
}

我的查询:

db.entrylike.aggregate(
   [
     { $project: { "pendingEntries.entryID": 1, "common": { $setIntersection: [ "$pendingEntries.tags", [{ "tagKey" : "ErrorCode", "tagValue" : "7001" }] ] } } }
   ]
)

结果:

{
    "result" : [ 
        {
            "_id" : 1,
            "pendingEntries" : [ 
                {
                    "entryID" : ObjectId("5701b4c3c6b126083332e65f")
                }
            ],
            "common" : []
        }, 
        {
            "_id" : 2,
            "pendingEntries" : [ 
                {
                    "entryID" : ObjectId("5701b4c3c6b126083332e65d")
                }
            ],
            "common" : []
        }, 
        {
            "_id" : 3,
            "pendingEntries" : [ 
                {
                    "entryID" : ObjectId("5701b4c3c6b126083332e65c")
                }
            ],
            "common" : []
        }
    ],
    "ok" : 1
}

我不希望第一个公共字段为空。有人能告诉我我做错了什么吗?或者我能采取的任何变通办法。

我正在使用MongoDB 3.0.8。我知道Mongob 3.2可以提供一些功能来满足我的需求,但3.2升级不会很快在我们的管道中,如果可能的话,我希望使用Mongo3.0解决这个问题。

共有1个答案

郎经纶
2023-03-14

公共字段为空的原因是“pendingEntries”数组和用户定义的数组没有公共元素。您真正想要的是返回一个数组,该数组包含出现在“标记”数组和用户定义数组中的元素。要做到这一点,只需使用$map操作符,并将$setIntersection操作符应用于“Pendingeries”数组中的每个子文档“tags”。

db.entrylike.aggregate([
    { "$project": { 
        "common": { 
            "$map": { 
                "input": "$pendingEntries", 
                "as": "p",
                "in": { 
                    "entryID": "$$p.entryID",
                    "tags": { 
                        "$setIntersection": [ 
                            "$$p.tags", 
                            { "$literal": [
                                { 
                                    "tagKey" : "ErrorCode", 
                                    "tagValue" : "7001" 
                                }
                            ]}
                        ]
                    }
                }
            }
        }
    }}
])

返回:

{
    "_id" : 1,
    "common" : [
        {
            "entryID" : ObjectId("5701b4c3c6b126083332e65f"),
            "tags" : [
                {
                    "tagKey" : "ErrorCode",
                    "tagValue" : "7001"
                }
            ]
        }
    ]
}
{
    "_id" : 2,
    "common" : [
        {
            "entryID" : ObjectId("5701b4c3c6b126083332e65d"),
            "tags" : [ ]
        }
    ]
}
{
    "_id" : 3,
    "common" : [
        {
            "entryID" : ObjectId("5701b4c3c6b126083332e65c"),
            "tags" : [ ]
        }
    ]
}
 类似资料:
  • 任何人都可以帮助我查询mongo以释放数组,我使用的是mongdb本机驱动程序我的收集文档如下,也请忽略我的objectId它只是示例 而我的预期产出是 我只想解开我的数组,在一个查询中的爱好描述之间添加一个逗号,谢谢你的帮助

  • 我正在查看MongoDB在和投影上的留档。我试图弄清楚如何只返回投影数组字段的子集,但我似乎无法弄清楚。 相关帖子: > 我没有试图从mongob聚合框架中执行$片-获取嵌套数组的第一个文档字段。 我也没有尝试从mongo projection中的仅返回数组值展平子文档,因为我仍然需要顶部文档中的一些字段。 假设我在集合中有以下文档: 我想要执行的查询是: 我希望它只返回数组中为的子文档下的。例如

  • 我是新来的mongo。我有以下收藏。 文件: 请求: 文档集合中的typeId是文档类型的id,其中请求中的typeId是也可以为空的外部字段。如何获得以下输出。

  • 对于使用分治方法的最大和子数组算法,我需要返回和和子数组。 我能在所有的测试中正确地计算和。然而,我无法计算出正确的子数组。 我的总数(正确):34 阵列:2 9 8 6 5-11 9-11 7 5-1-8-3 7-2 正确子数组:2 9 8 6 5 我的总数(正确):50 阵列:31-41 59 26-53 58 97-93-23 84 正确子数组:59 26-53 58 97 我的总数(正确)

  • 我有一个像这样的数组 我需要把所有的交集组成一个阵列。就像这样。 这是我的尝试,但丢失了。

  • 主要集合是零售商,其中包含用于商店的数组。每个商店都包含一系列优惠(您可以在此商店购买)。这提供了具有数组大小的数组。(见下面的例子) 现在我试图找到所有的优惠,这是在大小。 我尝试了这个查询: 我期待这样的输出: 但是,我的查询的输出还包含与XS、X和M不匹配的offer。 如何强制MongoDB只返回符合我查询的报价? 问候和感谢。