Mongo 查询以获取不同的嵌套文档

pha*_*ani 6 mongodb mongodb-query aggregation-framework

我需要获取不同的嵌套文档。

请找到示例文档:

{
    "propertyId": 1001820437,
    "date": ISODate("2020-07-17T00:00:00.000Z"),
    "HList":[
        {
            "productId": 123,
            "name": "Dubai",
            "tsh": true
        }
    ],
    "PList":[
        {
            "productId": 123,
            "name": "Dubai",
            "tsh": false
        },
        {
            "productId": 234,
            "name": "India",
            "tsh": true
        }
    ],
    "CList":[
        {
            "productId": 234,
            "name": "India",
            "tsh": false
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

预期结果是:

{
    "produts":[
        {
            "productId": 123,
            "name": "Dubai"
        },
        {
            "productId": 234,
            "name": "India"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我试过这个查询:

 db.property.aggregate([
    { 
        $match: { 
            "propertyId": 1001820437,
            "date": ISODate("2020-07-17T00:00:00.000Z")
        }
    },
    { 
        "$project": {
            "_id": 0,
            "unique": {
                "$filter": {    
                    "input": {
                        "$setDifference": [
                            { 
                                "$concatArrays": [
                                    "$HList.productId",
                                    "$PList.productId",
                                    "$CList.productId"
                                ]
                            },
                            []
                        ]  
                    },
                    "cond": { 
                        "$ne": [ "$$this", "" ] 
                    }
                }
            }
        }
    }
]);
Run Code Online (Sandbox Code Playgroud)

$setDifference聚合是正确的选择吗?
我的查询只返回唯一的产品 ID,但我需要一个productIdwith name. 有人可以帮我解决这个问题吗?提前致谢

mic*_*ckl 5

您可以$project先使用删除tsh字段,然后运行$setUnion忽略重复条目:

db.collection.aggregate([
    {
        $project: {
            "HList.tsh": 0,
            "PList.tsh": 0,
            "CList.tsh": 0,
        }
    },
    {
        $project: {
            products: {
                $setUnion: [ "$HList", "$PList", "$CList" ]
            }
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

蒙戈游乐场


pha*_*ani 0

db.collection.aggregate([
   { 
      $match: { 
               "propertyId": 1001820437,
               "date": ISODate("2020-07-17T00:00:00.000Z")
    
               }
    },
    {
        $project: {
            products: {
                $filter: {
                 input: { "$setUnion" : ["$CList", "$HList", "$PList"] },
                 as: 'product',
                 cond: {}
                 }
            }
         }
    },
    {
       $project: {            
                   "_id":0,
                   "products.tsh": 1,
                   "products.name": 1,           
                 }
    }, 
])
Run Code Online (Sandbox Code Playgroud)