【问题标题】:Mongoose query nested json array, return selected fieldsMongoose 查询嵌套的 json 数组,返回选中的字段
【发布时间】:2017-08-08 08:53:24
【问题描述】:

我是 mongo/mongoose 的新手(使用 3.4.0 版),我想编写一个查询来返回与给定条件匹配的文档 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"}
]

或者

db.tests.insert({name:'alpha', bag:[{ item:'apple', color:'red', size:'small'},{ item:'pear', color:'white', size:'small'},{ item:'apple', color:'green', size:'large'}]})
db.tests.insert({name:'beta', bag:[{ item:'apple', color:'brown', size:'small'},{ item:'pear', color:'white', size:'small'},{ item:'apple', color:'green', size:'medium'}]})

我希望能够查询这些数据,但只返回与查询项匹配的“bag”数据:“apple”,并且只返回“bag”中的“item”和“color”字段。

Name: "alpha", bag: [{ item: "apple",  color: "red" }, { item: "apple",  color: "green" }]
Name: "beta", bag: [{ item: "apple",  color: "brown" }, { item: "apple",  color: "green" }]

我尝试过将聚合与匹配和项目一起使用:

db.tests.aggregate([
    {"$match":{"bag.item":"apple"}},
    {"$project":{
        "Bag.item":{
            "$filter":{
            "input":"$bag",
            "As":"bag",
            "cond":{"$eq":["$$bag.item", "apple"]}
        }},
        "Bag.color":1
    }}]);

但这会返回所有项目的颜色字段,而不仅仅是苹果,并且仍然返回大小字段。

我见过这些:

Mongodb Trying to get selected fields to return from aggregate

Retrieve only the queried element in an object array in MongoDB collection

但还没有弄清楚如何限制嵌套 JSON 数组中的项目。

【问题讨论】:

  • 你的mongodb服务器版本是多少?
  • db.version() 是 3.4.0

标签: json mongodb


【解决方案1】:

您可以尝试以下 3.4 版本的聚合。 $addFields 使用过滤后的数组覆盖现有字段 bag,后跟 $project 并排除以删除 size 字段。

db.tests.aggregate([
    {"$match":{"bag.item":"apple"}},
    {"$addFields":{
        "bag":{
            "$filter":{
            "input":"$bag",
            "as":"result",
            "cond":{"$eq":["$$result.item", "apple"]}
        }}
    }},
    {"$project":{"bag.size":0}}
]);

【讨论】:

    猜你喜欢
    • 2015-04-18
    • 2015-12-19
    • 2020-08-01
    • 2019-07-08
    • 2017-07-05
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    相关资源
    最近更新 更多