【问题标题】:How to retrieve a specific field from a subdocument array with mongoose如何使用猫鼬从子文档数组中检索特定字段
【发布时间】:2014-10-30 16:17:10
【问题描述】:

我正在尝试从子文档数组中获取特定字段

我不会在父文档中包含任何字段

这里是示例文档

{
    "_id" : ObjectId("5409dd36b71997726532012d"),
    "hierarchies" : [ 
        {
            "rank" : 1,
            "_id" : ObjectId("5409df85b719977265320137"),
            "name" : "CTO",
            "userId" : [ 
                ObjectId("53a47a639c52c9d83a2d71db")
            ]
        }
    ]
}

如果 userId 在 userId 数组中,我想返回层次结构的等级

这是我目前查询的内容

collectionName.find({{hierarchies:
   {$elemMatch : {userId: ObjectId("53a47a639c52c9d83a2d71db")}}}
    , "hierarchies.$.rank", function(err,data){}

到目前为止,它返回了我想要的层次结构数组中的整个对象,但我想将它限制为对象的 rank 属性。

【问题讨论】:

  • 您是否尝试过使用 lean: true 获得结果 - 这可能有效...不是 100% 确定,只是一个想法。

标签: arrays mongodb mongoose subdocument


【解决方案1】:

在 MongoDB 中,.find() 查询可用的投影通常不会对数组的内部元素进行这种投影。您通常所能做的就是完全返回数组的“匹配”元素。

对于您想要的,您可以使用aggregation framework,它可以让您更好地控制匹配和投影:

Model.aggregate([
    { "$match": {
        "hierarchies.userId": ObjectId("53a47a639c52c9d83a2d71db")
    }},
    { "$unwind": "$hierarchies" },
    { "$match": {
        "hierarchies.userId": ObjectId("53a47a639c52c9d83a2d71db")
    }},
    { "$project": {
        "rank": "$hierarchies.rank"
    }}
],function(err,result) {

})

这基本上匹配文档,过滤文档的数组内容以仅匹配,然后仅投影所需的字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-26
    • 2020-07-25
    • 2020-07-25
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    相关资源
    最近更新 更多