mongodb中的$ filter数组

时间:2018-07-04 13:33:45

标签: mongodb mongodb-query

我需要您的帮助才能从和条件的集合中获取数据。假设我有一个包含以下文档的集合,我需要搜索名为brandId的值为14和38的子文档字段。

{
    "_id" : ObjectId("5b3b206c4a25da19d05f41a2"),
    "models" : [ 
        {
            "brandId" : "14",
            "modelId" : "100",
            "brandSlug" : "honda",
            "modelSlug" : "hrv"
        }, 
        {
            "brandId" : "38",
            "modelId" : "894",
            "brandSlug" : "toyota",
            "modelSlug" : "fortuner"
        }, 
        {
            "brandId" : "38",
            "modelId" : "894",
            "brandSlug" : "toyota",
            "modelSlug" : "fortuner"
        }, 
        {
            "brandId" : "37",
            "modelId" : "773",
            "brandSlug" : "suzuki",
            "modelSlug" : "ertiga"
        } 
    ]
}

我想要那个brandId为14和38的子文档。

所需的输出=>

{
    "_id" : ObjectId("5b3b206c4a25da19d05f41a2"),
    "models" : [ 
        {
            "brandId" : "14",
            "modelId" : "100",
            "brandSlug" : "honda",
            "modelSlug" : "hrv"
        }, 
        {
            "brandId" : "38",
            "modelId" : "1240",
            "brandSlug" : "toyota",
            "modelSlug" : "kijang-innova"
        }, 
        {
            "brandId" : "38",
            "modelId" : "894",
            "brandSlug" : "toyota",
            "modelSlug" : "fortuner"
        } 
    ]
}

2 个答案:

答案 0 :(得分:1)

为什么这么复杂?放松,比赛和分组将完美地完成工作。

db.test1.aggregate([
            {
                $unwind: {
                    path : "$models"
                }
            },
            {
                $match: {
                $or:[{"models.brandId":"14"},{"models.brandId":"38"}]
                }
            },
            {
                $group: {
                _id:"$_id",
                models:{$push:"$models"}
                }
            },
        ]
    );

答案 1 :(得分:0)

您可以尝试使用$filter运算符进行$or聚合

db.collection.aggregate([
  {
    "$addFields": {
      "models": {
        "$filter": {
          "input": "$models",
          "as": "model",
          "cond": {
            "$or": [
              {
                "$eq": [
                  "$$model.brandId",
                  "14"
                ]
              },
              {
                "$eq": [
                  "$$model.brandId",
                  "38"
                ]
              }
            ]
          }
        }
      }
    }
  }
])