如何在mongodb中检索选定的数组对象

时间:2017-04-11 13:51:06

标签: mongodb mongoose

我有像这样的mongodb数据

{
    "_id" : ObjectId("58eb32fb58bbf720a80daf6f"),
    "RoleName" : "Admin",
    "UIList" : [ 
        {
            "UiName" : "ManageRole",
            "View" : true,
            "Edit" : false,
            "_id" : ObjectId("58eb32fb58bbf720a80daf79")
        }, 
        {
            "UiName" : "ManageBuildings",
            "View" : false,
            "Edit" : false,
            "_id" : ObjectId("58eb32fb58bbf720a80daf78")
        }, 
        {
            "UiName" : "ManageFacility",
            "View" : true,
            "Edit" : false,
            "_id" : ObjectId("58eb32fb58bbf720a80daf77")
        }
    ],
    "__v" : 0,
    "Description" : "Full Control",
    "IsActive" : true
}

我想在UiName下的UIList中仅检索View:true:“ManageFacility”如何检索它。

我尝试在此查询后获取数据,但它会检索所有UIList Under Uiname:,View,Edit值。

db.getCollection("manage_roles_news").find(
    { _id:ObjectId("58eb32fb58bbf720a80daf6f")},
    {UIList: {$elemMatch: {UiName: "ManageFacility"}}});  

如何在Uiname下的UIlist中仅检索该视图:“ManageFacility”

任何人都可以告诉我

1 个答案:

答案 0 :(得分:1)

我认为没有方法可以投射positional/elemMatch投影中的各个字段。它总是解析为数组元素。

您可以尝试以下聚合到项目字段。以下查询使用$filter运算符查找匹配的数组值,这些值通过管道传递给$arrayAtElem以返回第一个元素(0),并将匹配的文档传递给$let运算符,然后是选择View属性。

db.getCollection("manage_roles_news").aggregate(
  { $match: { _id: ObjectId("58eb32fb58bbf720a80daf6f") } }, 
  { $project: { 
      _id:0,
      View: 
      { $let: { 
            vars: { 
              mElement: { 
                $arrayElemAt: [{
                            $filter: {
                                input: "$UIList",
                                as: "fElement",
                                cond: {
                                    $eq: ["$$fElement.UiName", "ManageFacility"]
                                }
                            }
                        }, 0]
                    }
                },
            in: {$cond:["$$mElement.View", 1, 0]}
            }
        }
    }
})