如何仅带回嵌套文档拟合过滤器
How to bring back only nested documents fitting filter
我创建了一个 mongodb 集合,其中的架构如下。
{user_id, listings: <Array of Documents>, ...}
在列表文档中,我有一个名为 status 的字段,它有两个值 publish 和 draft.
在 mongo shell 中,我试图仅返回具有 status:publish 的用户列表
所以我 运行 波纹管命令,我也不断返回带有 status:draft 的文档,这些文档是用户的一部分,已发布列表.
db.properties.find({'listings.status':'publish'},{'listings.status':1, _id:0})
输出:
[
{ listings: [ { status: 'draft' } ] },
{ listings: [ { status: 'publish' } ] },
{ listings: [ { status: 'draft' }, { status: 'publish' }, { status: 'draft' } ] },
{ listings: [ { status: 'publish' }, { status: 'draft' } ] },
{ listings: [ { status: 'publish' } ] }
]
如何获取只有状态为 publish 的列表的数组?
您可以使用具有 $filter
:
的聚合管道
$filter
listings
字段仅包含状态为 publish
. 的项目
$match
只有 $size
的 listings
大于 0 的文档。
- 格式
db.collection.aggregate([
{
$set: {
listings: {
$filter: {
input: "$listings",
as: "item",
cond: {
$eq: [
"$$item.status",
"publish"
]
}
}
}
}
},
{$match: {$expr: {$gt: [{$size: "$listings"}, 0]}}},
{$project: {listings: 1, _id: 0}}
])
我创建了一个 mongodb 集合,其中的架构如下。
{user_id, listings: <Array of Documents>, ...}
在列表文档中,我有一个名为 status 的字段,它有两个值 publish 和 draft.
在 mongo shell 中,我试图仅返回具有 status:publish 的用户列表 所以我 运行 波纹管命令,我也不断返回带有 status:draft 的文档,这些文档是用户的一部分,已发布列表.
db.properties.find({'listings.status':'publish'},{'listings.status':1, _id:0})
输出:
[
{ listings: [ { status: 'draft' } ] },
{ listings: [ { status: 'publish' } ] },
{ listings: [ { status: 'draft' }, { status: 'publish' }, { status: 'draft' } ] },
{ listings: [ { status: 'publish' }, { status: 'draft' } ] },
{ listings: [ { status: 'publish' } ] }
]
如何获取只有状态为 publish 的列表的数组?
您可以使用具有 $filter
:
$filter
listings
字段仅包含状态为publish
. 的项目
$match
只有$size
的listings
大于 0 的文档。- 格式
db.collection.aggregate([
{
$set: {
listings: {
$filter: {
input: "$listings",
as: "item",
cond: {
$eq: [
"$$item.status",
"publish"
]
}
}
}
}
},
{$match: {$expr: {$gt: [{$size: "$listings"}, 0]}}},
{$project: {listings: 1, _id: 0}}
])