mongodb获取所有文档,但仅获取特定的子文档

时间:2020-07-02 17:09:36

标签: mongodb aggregation-framework

我有类似的文件:

{ 
    "_id" : ObjectId("5ed79a6750869a5738e679c2"), 
    "SerialNumber" : "867688034502264", 
    "sharing":[ 
      { from:"abc", to: "123"},
      { from:"123", to: "435"}]
},
{ 
    "_id" : ObjectId("5ed79a6750869a5738e679c3"), 
    "SerialNumber" : "867688034502111"
}

我想获取所有文档,并且在共享字段中,我只想获取“ from”具有特定值(例如“ abc”)的子文档

我想得到:

{ 
    "_id" : ObjectId("5ed79a6750869a5738e679c2"), 
    "SerialNumber" : "867688034502264", 
    "sharing":[ 
      { from:"abc", to: "123"}]
},
{ 
    "_id" : ObjectId("5ed79a6750869a5738e679c2"), 
    "SerialNumber" : "867688034502111", 
    
} 

2 个答案:

答案 0 :(得分:0)

您可以在Aggregation Pipeline阶段使用$filter

db.collection.aggregate([
  {
    $project: {
      SerialNumber: "$SerialNumber",
      sharing: {
        $filter: {
          input: "$sharing",
          cond: {
            "$eq": [
              "$$this.from",
              "abc"
            ]
          }
        }
      }
    }
  }
])

https://mongoplayground.net/p/n41uUeDdv9Q

请注意,如果缺少属性,它将把sharing设置为null。如果存在问题,则可以在过滤之前进一步过滤文档,也可以在另一个阶段进行另一个$project

答案 1 :(得分:0)

您在投影中将find$elemMatch一起使用:

db.collection.find({}, {SerialNumber:1, sharing: {$elemMatch: {from: "abc"}}})

Playground