mongodb通过查询字段仅返回子文档

mongodb通过查询字段仅返回子文档,mongodb,mongoose,nested,subdocument,Mongodb,Mongoose,Nested,Subdocument,我有一个这样的结构: { "_id" : ObjectId("5b155aa3e7179a6034c6dd5b"), "pinnedKpi" : { "Ver01" : [ "130", "138", "122", "134" ], "Ver02" : [ "265", "263", "142", "264" ], "Ver03"

我有一个这样的结构:

{
"_id" : ObjectId("5b155aa3e7179a6034c6dd5b"),
"pinnedKpi" : {
    "Ver01" : [
        "130",
        "138",
        "122",
        "134"
    ],
    "Ver02" : [
        "265",
        "263",
        "142",
        "264"
    ],
    "Ver03" : [ ],
    "Ver04" : [
        "126",
        "134",
        "122",
        "138"
    ]
},
"email" : "john@doe.ca",
是否可以执行类似“仅返回电子邮件=john@doe.ca和pinnedKpi.Ver01-->
[“130”、“138”、“122”、“134”]

只需使用以下命令:

db.collection.find({ // find all documents
    "email": "john@doe.ca" // where the "email" field equals some value
}, {
    "_id": 0, // do not return the "_id" field (included by default)
    "pinnedKpi.Ver01": 1 // only return the "pinnedKpi.Ver01" field
})

如果数组不需要是响应的根元素,则可以使用以下查询返回带电子邮件条件的pinnedKpi.Ver01数组以及pinnedKpi数组中是否存在Ver01元素:

    db.test1.find(
      {"email" : "john@doe.ca", "pinnedKpi.Ver01" : {"$exists" : true}},
    {"pinnedKpi.Ver01" : 1}
    );
哪个输出:

{ 
    "_id" : ObjectId("5b155aa3e7179a6034c6dd5b"), 
    "pinnedKpi" : {
        "Ver01" : [
            "130", 
            "138", 
            "122", 
            "134"
        ]
    }
}
如果数组结果需要是根元素,则可以使用聚合框架来实现这一点:

db.test1.aggregate(
    [
        {
            $match: {email:"john@doe.ca","pinnedKpi.Ver01":{$exists:true}}
        },
        {
            $replaceRoot: {
            newRoot: "$pinnedKpi"
            }
        },
        {
            $project: {
               Ver01:1
            }
        },
    ]
);
输出:

{ 
    "Ver01" : [
        "130", 
        "138", 
        "122", 
        "134"
    ]
}

您希望查询返回的确切内容是什么?上面发布的数组我想说返回“email”所在的数组:john@doe.ca,而pinnkedKpi是Ver01这里1的意义是什么-->“pinnedKpi.Ver01”:1查询的第二部分(“_id”:0,“pinnedKpi.Ver01”:1)代表投影指令。0可以为假,1可以为真。这里默认包含的“_id”被排除,pinnedKpi.Ver01被手动包含在投影中。在同一个示例中,如果我向它传递一个变量,如
pinnedKpi.Ver0${version}
它即使在控制台上也不起作用。记录相同的字符串,就像我硬编码一样。请您尝试一下,这样我们就可以看到有什么问题了。另外,请让我们知道您使用的是哪种语言/客户端。在上面的同一个示例中,如果我向它传递一个变量,如pinnedKpi.Ver0${version},它即使在控制台上也无法工作。记录相同的字符串,就像我硬编码它一样。。如何传递变量