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

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

结构

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

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

我想要的是仅在feedback数组中的items字段不为空的情况下获取项目。预期结果是:

预期结果

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

这是我根据this中的示例进行的尝试,我认为情况大致相同,但是没有用。我的查询出了什么问题,链接中的邮政编码搜索示例中的情况是否相同?它返回类似于第一个JSON代码 Structure

的所有内容:

我尝试过的事情

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

谢谢。

jinsong0002 回答:仅当对象列表中的字段不为空时才过滤MongoDB查询以查找文档

请尝试:

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之后要少得多,那么您可以避免进入两个$match之间的$unwind阶段。

引用:

$match$unwind$project$group

,

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

db.stores.aggregate( [
  { $unwind: "$stores" },{ $unwind: "$stores.items" },{ $addFields: { feedbackExists: { $gt: [ { $size: "$stores.items.feedback" },0 ] } } },{ $match: { feedbackExists: true } },{ $project: { _id: 0,feedbackExists: 0 } }
] )
本文链接:https://www.f2er.com/3080175.html

大家都在问