首页 > 解决方案 > mongodb 聚合 $in 和 $type

问题描述

我有一个收藏:

{
  values: [null, null, 1, 2, 3, 4.6],
}

我想收到一个属性,它告诉我这些值是否是数字。

我试过了:

{
    $project: {
        hasNumber: {
            $in: [{ $eq: [{ $type: '$$CURRENT' }, 'number'] }, '$values'],
        },
    },
}

但它不起作用,聚合可能会发生这样的事情吗?

标签: mongodbaggregate

解决方案


请试试这个:

db.yourCollectionName.aggregate([{
    $project: {
        values: 1, hasNumber: {
            $gt: [{
                $size: {
                    $filter:
                    {
                        input: "$values",
                        as: "value",
                        cond: { $eq: [{ $type: '$$value' }, 'int'] }
                        // To check & include double as well, replace above cond with this :
                       //cond: { $or :[ {$eq: [{ $type: '$$value' }, 'int']} , {$eq: [{ $type: '$$value' }, 'double']}] }
                    }
                }
            }, 0]
        }
    }
}])

收集数据:

/* 1 */
{
    "_id" : ObjectId("5e14d9dd627ef78236ea77e3"),
    "values" : [ 
        null, 
        null, 
        1, 
        2, 
        3, 
        4.6
    ]
}

/* 2 */
{
    "_id" : ObjectId("5e14d9e4627ef78236ea785f"),
    "values" : [ 
        null, 
        null
    ]
}

/* 3 */
{
    "_id" : ObjectId("5e14decc627ef78236eb12d3"),
    "values" : [ 
        "1", 
        4.6
    ]
}

结果 :

/* 1 */
{
    "_id" : ObjectId("5e14d9dd627ef78236ea77e3"),
        "values" : [
            null,
            null,
            1,
            2,
            3,
            4.6
        ],
            "hasNumber" : true
}

/* 2 */
{
    "_id" : ObjectId("5e14d9e4627ef78236ea785f"),
        "values" : [
            null,
            null
        ],
            "hasNumber" : false
}
/* 3 */ // If we're checking for double this hasNumber will be true
{
    "_id" : ObjectId("5e14decc627ef78236eb12d3"),
        "values" : [
            "1",
            4.6
        ],
            "hasNumber" : false
}

推荐阅读