首页 > 解决方案 > 仅从对象 mongoose 数组返回匹配项

问题描述

[
  {
    item: "journal",
    instock: [
      {
        warehouse: "A",
        qty: 5,
        items: null
      },
      {
        warehouse: "C",
        qty: 15,
        items: [
          {
            name: "alexa",
            age: 26
          },
          {
            name: "Shawn",
            age: 26
          }
        ]
      }
    ]
  }
]
db.collection.find({
  "instock.items": {
    $elemMatch: {
      name: "alexa"
    }
  }
})

这将返回整个项目数组,因为我只想要一个项目数组 {name: 'alexa', age: 26}

游乐场链接:https ://mongoplayground.net/p/0gB4hNswA6U

标签: mongodbmongoosemongodb-query

解决方案


您可以使用该.aggregate(pipeline)功能。

您的代码将如下所示:

db.collection.aggregate([{
    $unwind: {
        path: "$instock"
    }
}, {
    $unwind: {
        path: "$instock.items"
    }
}, {
    $replaceRoot: {
        newRoot: "$instock.items"
    }
}, {
    $match: {
        name: "alexa"
    }
}])

此管道中使用的命令:

$unwind - 将项目数组解构为多个文档,这些文档都包含原始文档的原始字段,但展开字段现在具有数组中所有解构对象的值。

$replaceRoot - 获取引用的内部对象newRoot并将其作为文档。

$match - 一种根据某些条件过滤您最终获得的文档列表的方法。基本上是函数中的第一个参数.find()

有关聚合的更多信息,请访问 MongoDB 的网站:

编辑

想要的结果是获取单个项目数组作为响应,以实现您可以简单地删除$replaceRoot管道中的阶段。

最终管道:

db.collection.aggregate([{
    $unwind: {
        path: "$instock"
    }
}, {
    $unwind: {
        path: "$instock.items"
    }
}, {
    $match: {
        "instock.items.name": "alexa"
    }
}])

推荐阅读