Mongoose查询嵌套json数组,返回所选字段

Mongoose查询嵌套json数组,返回所选字段,json,mongodb,Json,Mongodb,我不熟悉使用3.4.0版的mongo/mongoose,我想编写一个查询,返回与给定条件匹配的文档JSON数组的子集。 我的文档模型包含一个JSON数组,我希望查询只返回数组中发生匹配的记录,并且只返回特定字段 下面是一个示例模式: Var testSchema = Schema({ name: { type: String }, bag: { type: Array} // JSON row data, containing fields name, phone, etc... })

我不熟悉使用3.4.0版的mongo/mongoose,我想编写一个查询,返回与给定条件匹配的文档JSON数组的子集。 我的文档模型包含一个JSON数组,我希望查询只返回数组中发生匹配的记录,并且只返回特定字段

下面是一个示例模式:

Var testSchema = Schema({
  name: { type: String },
  bag: { type: Array}  // JSON row data, containing fields name, phone, etc...
});
示例数据:

name: "alpha",
bag: [ 
  { item:"apple", color:"red",   size:"small"},
  { item:"pear",  color:"white", size:"small"},
  { item:"apple", color:"green", size:"large"}
]

name: "beta",
bag: [ 
  { item:"apple", color:"brown", size:"small"},
  { item:"pear",  color:"white", size:"small"},
  { item:"apple", color:"green", size:"medium"}
]

我希望能够查询这些数据,但只返回与查询项目匹配的行李数据:apple,并且只返回行李中的项目和颜色字段

Name: "alpha", bag: [{ item: "apple",  color: "red" }, { item: "apple",  color: "green" }]
Name: "beta", bag: [{ item: "apple",  color: "brown" }, { item: "apple",  color: "green" }]
我已尝试将聚合与match和project一起使用:

db.tests.aggregate([
    {"$match":{"bag.item":"apple"}},
    {"$project":{
        "Bag.item":{
            "$filter":{
            "input":"$bag",
            "As":"bag",
            "cond":{"$eq":["$$bag.item", "apple"]}
        }},
        "Bag.color":1
    }}]);
但这将返回所有项目的颜色字段,而不仅仅是苹果,并且仍然返回大小字段

我看到了这些:


但是仍然没有弄清楚如何限制嵌套JSON数组中的项。

您可以在下面的聚合中尝试3.4版本$addFields使用过滤数组覆盖现有字段包,然后使用$project和Exclusive删除大小字段


您的mongodb服务器版本是什么?db.version是3.4.0
db.tests.aggregate([
    {"$match":{"bag.item":"apple"}},
    {"$project":{
        "Bag.item":{
            "$filter":{
            "input":"$bag",
            "As":"bag",
            "cond":{"$eq":["$$bag.item", "apple"]}
        }},
        "Bag.color":1
    }}]);
db.tests.aggregate([
    {"$match":{"bag.item":"apple"}},
    {"$addFields":{
        "bag":{
            "$filter":{
            "input":"$bag",
            "as":"result",
            "cond":{"$eq":["$$result.item", "apple"]}
        }}
    }},
    {"$project":{"bag.size":0}}
]);