【问题标题】:How to use variable name in array.indexOf in MongoDB $projection pipeline如何在 MongoDB $projection 管道中的 array.indexOf 中使用变量名
【发布时间】:2015-04-13 17:22:01
【问题描述】:

我有一个类似的收藏

   {
        "LifeTime" : 123.000,
        "Host" : "xxx.com",
    }, 
    {
        "LifeTime" : 213.000,
        "Host" : "yyy.com",
    }, 
    {
        "LifeTime" : 321.000,
        "Host" : "zzz.com",

    } 

和一个预定义的数组,比如

["xxx.com","yyy.com"]

现在我想使用 $let$cond 进行投影,这样如果数组中存在主机,则 LifeTime 将为 0,否则与 LifeTime 相同。

我试过了

LifeTime: {
    $let: {
    vars: {
        hostname: '$Host'
    },
    in: {
        "$cond": [
            {
                "$and": [
                    {
                        "$gte": [
                            ArrayOfPredefinedHost.indexOf('$$hostname'),
                            0
                        ]
                    }
                ]
            },
            0,
            "$LifeTime"
        ]
    }
    }
}

但它没有返回预期的结果。我认为indexOf 试图找到$$hostname 而不是xxx.com,yyy.com & zzz.com

我该如何做这种复杂的查询?

【问题讨论】:

    标签: mongodb mongoose mongodb-query


    【解决方案1】:

    以下聚合管道将首先对文档进行分组,以允许使用 $addToSet 累加器运算符包含单个主机元素的附加数组字段。然后,这个附加字段将在 $cond 表达式中的下一个 $project 管道阶段使用,利用 $setIsSubset 运算符:

    var ArrayOfPredefinedHost = ["xxx.com", "yyy.com"];
    db.collection.aggregate([
        {
            "$group": {
                "_id": {
                    "id": "$_id",
                    "LifeTime": "$LifeTime",
                    "Host": "$Host"
                },
                "HostSet": { "$addToSet": "$Host" }
            }
        },
        {
            "$project": {
                "_id": 0,
                "LifeTime": {
                    "$cond": [ { "$setIsSubset": [ "$HostSet", ArrayOfPredefinedHost ] }, "$_id.LifeTime", 0]
                },
                "Host": "$_id.Host"
            }
        }
    ]);
    

    输出

    /* 0 */
    {
        "result" : [ 
            {
                "LifeTime" : 0,
                "Host" : "zzz.com"
            }, 
            {
                "LifeTime" : 213,
                "Host" : "yyy.com"
            }, 
            {
                "LifeTime" : 123,
                "Host" : "xxx.com"
            }
        ],
        "ok" : 1
    }
    

    【讨论】:

    • 啊!甜的。太好了,谢谢!
    • @AnkitSarkar 不用担心 :-)
    猜你喜欢
    • 2017-08-08
    • 2021-05-12
    • 2019-11-02
    • 1970-01-01
    • 2021-09-21
    • 2020-06-08
    • 2020-04-09
    • 1970-01-01
    • 2022-07-21
    相关资源
    最近更新 更多