Mongodb 嵌套数组中的投影

Rya*_*ill 6 nested mongodb

我在 Mongodb 中有一个嵌套严重的文档,它遵循以下顺序:

站点 -> 房间 -> ups -> BatteryStrings -> 电池。

我试图只返回匹配的batteryStrings 和它的电池batteryString _id

db.getCollection('sites').find({
    "rooms.ups.batteryStrings._id": ObjectId("55dc967efefd4e6a14332019")
    }, {
        "rooms.ups.batteryStrings.batteries.$": 1,
        "siteName": 1
    }
)
Run Code Online (Sandbox Code Playgroud)

我得到以下内容,其中包含 2 个batteryStrings。我只想归还第二个电池串(以黄色突出显示)及其电池。

在此处输入图片说明

我最初尝试这样做,但得到了相同的结果:

db.getCollection('sites').find({
"rooms.ups.batteryStrings._id": ObjectId("55dc967efefd4e6a14332019")
}, {
    "rooms.ups.batteryStrings.$": 1,
    "siteName": 1
})
Run Code Online (Sandbox Code Playgroud)

chr*_*dam 3

您可以尝试聚合框架来达到预期的结果。管道需要使用初始$match运算符来过滤掉不需要的文档以进入管道。获得所需的文档后,您将$unwind在数组字段上运行多个运算符,为数组字段中的每个元素输出一个文档,以便在下一个管道步骤中使用。以下管道需要使用$match运算符从解构数组中过滤其他文档,然后为您提供所需的文档。管道的最后一步,$project然后重塑流中的每个文档,例如通过添加新字段或删除现有字段。对于每个输入文档,输出一个文档。因此,以下管道将为您提供结果:

db.sites.aggregate([
    {
        "$match": {
            "rooms.ups.batteryStrings._id": ObjectId("55dc967efefd4e6a14332019")
        }
    },
    { "$unwind": "$rooms" },
    { "$unwind": "$rooms.ups" },
    { "$unwind": "$rooms.ups.batteryStrings" },
    {
        "$match": {
            "rooms.ups.batteryStrings._id": ObjectId("55dc967efefd4e6a14332019")
        }
    },
    {
        "$project": {
            "siteName": 1,
            "batteryStrings": "$rooms.ups.batteryStrings"
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

运行管道操作将产生结果:

/* 0 */
{
    "result" : [ 
        {
            "_id" : ObjectId("5613c98a645a64b1a70af2c1"),
            "siteName" : "OGG",
            "batteryStrings" : {
                "name" : "String 1",
                "ctrlId" : "bmstest11",
                "_id" : ObjectId("55dc967efefd4e6a14332019"),
                "batteries" : [ 
                    {
                        "name" : "String 2a",
                        "ctrlId" : "bmstest11",
                        "_id" : ObjectId("55e67b28010000880ca4c045")
                    }, 
                    {
                        "name" : "String 2b",
                        "ctrlId" : "bmstest11",
                        "_id" : ObjectId("55ea1b520100006d004e602a")
                    }, 
                    {
                        "name" : "String 2c",
                        "ctrlId" : "bmstest11",
                        "_id" : ObjectId("55ea1b520100006d004e602b")
                    }
                ]
            }
        }
    ],
    "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)