仅当对象列表中的字段不为空时,筛选MongoDB查询以查找文档



我有一个MongoDB文档结构,如下所示:

结构

{
"stores": [
{
"items": [
{
"feedback": [],
"item_category": "101",
"item_id": "10"
},
{
"feedback": [],
"item_category": "101",
"item_id": "11"
}
]
},
{
"items": [
{
"feedback": [],
"item_category": "101",
"item_id": "10"
},
{
"feedback": ["A feedback"],
"item_category": "101",
"item_id": "11"
},
{
"feedback": [],
"item_category": "101",
"item_id": "12"
},
{
"feedback": [],
"item_category": "102",
"item_id": "13"
},
{
"feedback": [],
"item_category": "102",
"item_id": "14"
}
],
"store_id": 500
}
]
}

这是集合中的单个文档。删除某些字段以生成数据的最小表示形式。

我想要的是,只有当items数组中的feedback字段不为空时,才能获取项。预期结果是:

预期结果

{
"stores": [
{
"items": [
{
"feedback": ["A feedback"],
"item_category": "101",
"item_id": "11"
}
],
"store_id": 500
}
]
}

这是我根据这个例子所做的尝试,我认为情况基本相同,但没有奏效。我的查询出了什么问题,不是与链接中邮政编码搜索示例中的情况相同吗?它返回第一个JSON代码中的所有内容,Structure:

我尝试了什么

query = {
'date': {'$gte': since, '$lte': until},
'stores.items': {"$elemMatch": {"feedback": {"$ne": []}}}
}

谢谢。

请尝试以下操作:

db.yourCollectionName.aggregate([
{ $match: { 'date': { '$gte': since, '$lte': until }, 'stores.items': { "$elemMatch": { "feedback": { "$ne": [] } } } } },
{ $unwind: '$stores' },
{ $match: { 'stores.items': { "$elemMatch": { "feedback": { "$ne": [] } } } } },
{ $unwind: '$stores.items' },
{ $match: { 'stores.items.feedback': { "$ne": [] } } },
{ $group: { _id: { _id: '$_id', store_id: '$stores.store_id' }, items: { $push: '$stores.items' } } },
{ $project: { _id: '$_id._id', store_id: '$_id.store_id', items: 1 } },
{ $group: { _id: '$_id', stores: { $push: '$$ROOT' } } },
{ $project: { 'stores._id': 0 } }
])

我们有所有这些阶段,因为你需要对数组进行操作,这个查询是在假设你处理一组大数据的情况下编写的。由于你是在筛选日期,以防你的文档大小在第一个$match之后小得多,那么你可以避免在两个$unwind之间的$match阶段。

参考:

$match,$undup,$项目,$group

此聚合查询获得所需的结果(使用提供的示例文档并从mongoshell运行(:

db.stores.aggregate( [
{ $unwind: "$stores" },
{ $unwind: "$stores.items" },
{ $addFields: { feedbackExists: { $gt: [ { $size: "$stores.items.feedback" }, 0 ] } } },
{ $match: { feedbackExists: true } },
{ $project: { _id: 0, feedbackExists: 0 } }
] )

最新更新