MongoDB按第三级嵌入式对象过滤

时间:2018-08-20 08:28:56

标签: mongodb

我正在使用MongoDB 3+版本。我有一些文件(“ doc”) “ doc”具有“行”列表。每行都有“单位”列表。单位的字段为“状态”。

我必须返回带行的文档,但是仅需要在状态为“新”的情况下包含单元。

{
    "_id" : ObjectId("5b7a7184e0e432207cc47612"),
    "_class" : "MyClass",
    "rows" : [ 
        {            
            "activity" : false,
            "units" : [ 
                {
                    "unitId" : "35",
                    "status" : "status",
                    "bookingDay" : {
                        "dateValue" : ISODate("2018-06-30T21:00:00.000Z")
                    }
                }, 
                {
                    "unitId" : "40",
                    "status" : "new",
                    "bookingDay" : {
                        "dateValue" : ISODate("2018-08-15T21:00:00.000Z")
                    }
                }
            ]
        }
    ],
    "mediaId" : NumberLong(4)
}

预期结果-排除了第一个单位

{
    "_id" : ObjectId("5b7a7184e0e432207cc47612"),
    "_class" : "com.samsolutions.adbuybackend.model.booking.radio.BookingBoardRadio",
    "rows" : [ 
        {
            "rubricName" : "rubric1",
            "timeFrom" : ISODate("2018-08-20T07:20:00.000Z"),
            "activity" : false,
            "units" : [
                {
                    "unitId" : "40",
                    "status" : "new",
                    "bookingDay" : {
                        "dateValue" : ISODate("2018-08-15T21:00:00.000Z")
                    }
                }
            ]
        }
    ],
    "mediaId" : NumberLong(4)
}

1 个答案:

答案 0 :(得分:0)

db.getCollection("doc").aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $unwind: {
                path: "$rows",
                includeArrayIndex: "arrayIndex", // optional
                preserveNullAndEmptyArrays: false // optional
            }
        },

        // Stage 2
        {
            $project: {
                rows: {
                    units: {
                        $filter: {
                            input: "$rows.units",
                            as: "item",
                            cond: {
                                $eq: ["$$item.status", "new"]
                            }
                        }
                    }
                },
                _class: 1,
                mediaId: 1
            }
        },

    ]



);