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

2024-06-07 16:17:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我的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
        }
    ]
}

这是我根据this中的示例所做的尝试,我认为情况非常相似,但没有起作用。我的查询有什么问题,链接中的zipcode search示例不也是这种情况吗?它返回第一个JSON代码中的所有内容,结构

我尝试的

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

谢谢。你知道吗


Tags: 数据store文档id示例mongodb情况items
2条回答

请试试这个:

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$unwind$project$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 } }
] )

相关问题 更多 >

    热门问题