在mongoDB中只检索单个文档中的查询元素

gmxoilav  于 2022-12-26  发布在  Go
关注(0)|答案(2)|浏览(134)

我有一个像下面这样的集合:

`{
    "topics" : [ 
        {
            "id" : "2",
            "name" : "Test1",
            "owner" : [ 
                "123"
            ]
        }, 
        {
            "id" : "3",
            "name" : "Test2",
            "owner" : [ 
                "123", 
                "456"
            ]
        }
]
}`

由于此数据在单个文档中,并且我只希望基于其owner匹配元素,因此我使用以下查询(在聚合中使用筛选器),但我得到0个匹配元素。查询:
提前感谢...!!

db.getCollection('topics').aggregate([
  {"$match":{"topics.owner":{"$in":["123","456"]}}},
  {"$project":{
    "topics":{
      "$filter":{
        "input":"$topics",
        "as":"topic",
        "cond": {"$in": ["$$topic.owner",["123","456"]]}
      }},
    "_id":0
  }}
])

此查询应生成以下输出:

{
    "topics" : [ 
        {
            "id" : "1",
            "name" : "Test1",
            "owner" : ["123"]
        }, 
        {
            "id" : "2",
            "name" : "Test2",
            "owner" : ["123","456"]
        }
    ]
}
dwbf0jvd

dwbf0jvd1#

因为topic.owner是一个数组,所以不能直接使用$in,因为它比较数组是否在数组中。
相反,您应该执行以下操作:

  1. $filter-过滤topics数组中的文档。
    1.1. $gt-比较结果 1.1.1 大于0。
    1.1.1. $size-从结果 1.1.1.1 中获取数组的大小。
    1.1.1.1. $setIntersection-将topic.owner数组与输入数组求交集。
{
  "$project": {
    "topics": {
      "$filter": {
        "input": "$topics",
        "as": "topic",
        "cond": {
          $gt: [
            {
              $size: {
                $setIntersection: [
                  "$$topic.owner",
                  [
                    "123",
                    "456"
                  ]
                ]
              }
            },
            0
          ]
        }
      }
    },
    "_id": 0
  }
}

Demo @ Mongo Playground

hec6srdp

hec6srdp2#

db.getCollection('topics').aggregate([
{"$unwind":"$topics"},
{"$addFields":{
    "rest":{"$or":[{"$in":["12z3","$topics.owner"]},{"$in":["456","$topics.owner"]}]}
    }},
    {"$match":{
        "rest":true
        }},
        {"$group":{
            "_id":"$_id",
            "topics":{"$push":"$topics"}
            }}
])

相关问题