mongodb - 仅从对象 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}
解决方案
您可以使用该.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"
}
}])
推荐阅读
- javascript - 在滚动事件中使用 Jquery
- r - 如何选择分组数据的第一个值并在 R 中进行比较?
- docker - 无法通过 Jenkins 管道删除 docker 映像
- python - 有没有办法只在 nlogn 中使用 MaxHeap 来找到中位数?
- google-visualization - 如何折叠谷歌图表中的标题区域
- python - 如何在 Python 函数中打印出字符串列表?
- javascript - React Js:滚动快照不起作用解决方案是什么
- html - 试图将 2 个带有图像和文本的 div 并排放置
- javascript - 为什么 JS 中的 Map 在 redux 中被认为是不可序列化的?
- python - `float.as_integer_ratio` 方法是否有等效的 Python C API?