当前位置: 首页 > 知识库问答 >
问题:

mongodb查询并返回文档数组中的特定元素,即使为null也会返回一些结果

苍兴怀
2023-03-14

假设我收集了以下文档:

 {_id: 1,fruit: apple,attributes: [{color: red,size: small,qty: 5},{color: green,size: small, qty 3}]},
 {_id: 2,fruit: mango,attributes: [{color: red,size: big, qty: 6},{color: green,size: small, qty: 7},{color: gold,size: medium, qty: 5},{color: yellow,size: small, qty: 20}]},
 {_id: 3,fruit: pineapple },
 {_id: 4,fruit: orange,attributes: [{color: orange,size: small,qty: 2}]}
  • 所有文档都将始终有“水果”字段
  • 某些文档可能没有“attributes”数组
  • 对于属性数组中包含元素的文档,它可以是1到20个元素

我需要根据属性返回这个。数量介于4和8之间

>

  • 即使属性字段缺失或数量标准不匹配,也始终显示id和水果
  • 在属性数组中最多只显示2个符合搜索条件的元素,按数量降序排序

    {_id:1,水果:苹果,属性:[{颜色:红色,大小:小,数量:5}]},

    {u id:2,水果:芒果,属性:[{颜色:绿色,大小:小,数量:7},{颜色:红色,大小:大,数量:6}]},

    {\u id:3,水果:菠萝},

    {_id:4,水果:橙色}

    这是我正在使用的查询:

    db.test.aggregate([
    {"$unwind":"$attributes"},
    {"$match":{"attributes.qty": {$gt:4, $lt:8}}},
    {"$group":{"_id":"$_id","fruit":{$first:"$fruit"},"attributes":{$addToSet: "$attributes"}}}
    ])
    

    我得到以下结果:

     {_id: 1,fruit: apple,attributes: [{color: red,size: small,qty: 5}]},
     {_id: 2,fruit: mango,attributes: [{color: red,size: big, qty: 6},{color: green,size: small, qty: 7},{color: gold,size: medium, qty: 5}]}
    

    这没有菠萝和橙子记录;芒果属性中的值没有排序,也不限于2

    请帮忙

    更新

    尝试使用$redact。仍然没有接近获得所需的输出。在使用$and时,没有输出

    db.test.aggregate([
    {$match:{"site":{$exists:true}}},
            { "$redact": {
            "$cond": {
                "if": {
                    $and:[ 
                    {"$gt": ["$qty",4]},
                    {"$lt": ["$qty,8]}
                    ]
                },
                "then": "$$DESCEND",
                "else": "$$PRUNE"
            }
        }}
    ])
    
  • 共有1个答案

    谷光誉
    2023-03-14

    此查询应提供接近所需结果的结果。

    db.test.aggregate([
        { 
            "$redact": {
                "$cond": {
                    "if": { $or : [ {$and:[ {"$gt": ["$qty",4]},{"$lt": ["$qty",8]}]}, { $not : "$qty" }]},
                    "then": "$$DESCEND",
                    "else": "$$PRUNE"
                }
            }
        },
        {
            '$project': {
                'fruit': 1,
                'attributes' : {
                    "$cond" : [{'$and': [ {$ne : ["$attributes", []]},{"$ifNull": ["$attributes", false] }]},"$attributes", [{ 'qty':'test'}] ]
                }
            }
        },
        {'$unwind': '$attributes'},
        {'$sort': {'attributes.qty': -1}},
        {'$group': {'_id': '$_id' , 'fruit' : {'$first': '$fruit'},'attributes': {'$push' : '$attributes'}}},
        {
            "$redact": {
                "$cond": {
                    "if": { '$ne': ['$qty','test']},
                    "then": "$$DESCEND",
                    "else": "$$PRUNE"
                }
            }
        },
    ])
    

    请注意,{$not:"$qty"}是必要的,因为它也会扫描顶部文档,如果$redact在顶部没有找到qty字段,这将返回false,这可能会删除我们不想要的整个文档。

    结果:

    {
        "result" : [ 
            {
                "_id" : ObjectId("5568335b52cdca6ba1c290f0"),
                "fruit" : "apple",
                "attributes" : [ 
                    {
                        "color" : "red",
                        "size" : "small",
                        "qty" : 5
                    }
                ]
            }, 
            {
                "_id" : ObjectId("5568335b52cdca6ba1c290f1"),
                "fruit" : "mango",
                "attributes" : [ 
                    {
                        "color" : "green",
                        "size" : "small",
                        "qty" : 7
                    }, 
                    {
                        "color" : "red",
                        "size" : "big",
                        "qty" : 6
                    }, 
                    {
                        "color" : "gold",
                        "size" : "medium",
                        "qty" : 5
                    }
                ]
            }, 
            {
                "_id" : ObjectId("5568335b52cdca6ba1c290f3"),
                "fruit" : "orange",
                "attributes" : []
            }, 
            {
                "_id" : ObjectId("5568335b52cdca6ba1c290f2"),
                "fruit" : "pineapple",
                "attributes" : []
            }
        ],
        "ok" : 1
    }
    

    不幸的是(在MongoDB 3.0中)聚合管道没有等效的$切片。在MongoDB问题跟踪器中支持/观看的相关功能请求是SERVER-6074:在$project中允许$切片运算符。

    因此,您需要一个变通方法来获取最多2个文档。

    • 在应用程序代码中操纵结果
    • 使用Map/Reduce实现聚合
     类似资料:
    • 问题内容: 我正在尝试使用getElementById()获取元素,但是即使元素存在,它也会返回null。我究竟做错了什么? 问题答案: 您必须将其放在一个 事件中。脚本执行时尚未到达DOM 。

    • 问题内容: 我想返回数组的奇数,但是Eclipse似乎不接受我的返回码。我认为这需要返回整个数组,因为我将数组设置为方法的参数。如前所述,我需要传递一个数组并获取该数组的特定元素作为回报。即使我将该数组设为静态,如何返回单个元素? 编辑:好吧,这里是: 我知道这里可能存在多个错误,但我正在努力,不仅要返回奇数,还要将它们加在一起。 问题答案: 您的代码应如下所示: 这里的要点是方法返回类型,它应该

    • Firebase查询返回此查询的值 该项由model类捕获 但是,返回null

    • 我正在建立一个登录系统,我遇到了一些问题,我不知道如何解决。我用find()和findOne()尝试了一些不同的选项,但在我的情况下两者都不起作用。下面是我试图解决这个问题的第一个解决方案。 此解决方案返回catch响应:User Not found。 这是我尝试过的第二种解决方案: 此解决方案返回:无法将属性“username”设置为null。 在这两种情况下,我都发送此请求:,它是我知道存在于

    • 请帮我检查数据库属性。 然后,sizeBinding有第一个元素null(用于宽度)和绑定表达式实例(用于高度绑定)。我可以使用Mode=twoway设置绑定,但是我想知道为什么如果Mode没有设置为twoway就不会创建绑定实例。我认为这是因为表达式需要比路径更复杂。但是,我尝试了,但是返回null作为绑定。我尝试了GetBinding*方法,但它们的行为与完全相同。 我谷歌搜索的唯一一个问题就

    • 我正在使用JDBC创建一个数据库,其中包含表和。两者都有一个名为 以下是我创建和填充表的SQL语句: 我试图运行以下查询: 或 或 使用 但是我没有得到任何结果。 这两个问题都可以解决。 SQLite数据库服务器显示相同的问题: 它与Firefox中的SQLite Manager一起工作。