MongoDB查询:列出所有具有值NaN的字段

MongoDB查询:列出所有具有值NaN的字段,mongodb,mongodb-query,aggregation-framework,nan,Mongodb,Mongodb Query,Aggregation Framework,Nan,假设MongoDB有一个包含对象“sample1”的集合,该对象具有以下字段: /* 1 */ { "_id" : 123456, "name" : "question", "day" : "2018-03-21", "field1" : 10, "field2" : NaN, "field3" : NaN, "field4" : NaN, "field5" : NaN } /* 2 */ { "_id" : 789632

假设MongoDB有一个包含对象“sample1”的集合,该对象具有以下字段:

/* 1 */ {
    "_id" : 123456,
    "name" : "question",
    "day" : "2018-03-21",
    "field1" : 10,
    "field2" : NaN,
    "field3" : NaN,
    "field4" : NaN,
    "field5" : NaN }

/* 2 */ {
    "_id" : 7896321,
    "name" : "question",
    "day" : "2018-03-22",
    "field1" : NaN,
    "field2" : NaN,
    "field3" : NaN,
    "field4" : NaN,
    "field5" : 20 }
我想要的是字段的“列表”,它只显示那些没有NaN作为值的字段。 查询可能看起来像

db.getCollection('sample1').find({"*" : $ne{NaN}})
[注意:我找到的所有答案都指定字段名=键。唉,我需要一个通配符而不是名称]

上述demo_查询的结果如下所示

Result:
/* 1 */
{
    "_id" : 123456,
    "name" : "question",
    "day" : "2018-03-21",
    "field1" : 10
}
/* 2 */
{
    "_id" : 7896321,
    "name" : "question",
    "day" : "2018-03-22",
    "field5" : 20
}
因此,有一项跟进质询: 是否可以修改上面的查询,使 (A) 一个值为NaN或的字段列表 (B) 一个没有NaN的字段列表

Result (A): List of fields that have at least in one object a given field might have NaN 
    {"field1"
    "field2" 
    "field3"
    "field4" 
    "field5" }

Result (B): List of fields that never (= in no object of a given collection) have the value NaN 
    {"_id"
    "name"
    "day" }
我在JS方面的经验非常有限。也许这可以用PyMongo来完成

非常感谢你的建议

使用聚合框架中可用的运算符将顶级文档(通过系统变量)转换为键值对数组,即,保存字段名的键和保存字段值的值。这可以通过表达式实现

{ "$objectToArray": "$$ROOT" }
它将返回,例如,第一个id为123456的文档

[ 
    {
        "k" : "_id",
        "v" : 123456
    }, 
    {
        "k" : "name",
        "v" : "question"
    }, 
    {
        "k" : "day",
        "v" : "2018-03-21"
    }, 
    {
        "k" : "field1",
        "v" : 10
    }, 
    {
        "k" : "field2",
        "v" : NaN
    }, 
    {
        "k" : "field3",
        "v" : NaN
    }, 
    {
        "k" : "field4",
        "v" : NaN
    }, 
    {
        "k" : "field5",
        "v" : NaN
    }
]
获取此数组后,您可以使用进行过滤,然后获得所需的列表


下面的聚合操作

db.getCollection('sample1').aggregate([
    { "$addFields": { 
        "NaNFields": {
            "$map": {
                "input": {
                    "$filter": {
                        "input": { "$objectToArray": "$$ROOT" },
                        "as": "el",
                        "cond": { "$eq": [ "$$el.v", NaN ] }
                    }
                },
                "as": "field",
                "in": "$$field.k"
            }
        },
        "NonNaNFields": {
            "$map": {
                "input": {
                    "$filter": {
                        "input": { "$objectToArray": "$$ROOT" },
                        "as": "el",
                        "cond": { "$ne": [ "$$el.v", NaN ] }
                    }
                },
                "as": "field",
                "in": "$$field.k"
            }
        } 
    } }
])
屈服

/* 1 */
{
    "_id" : 123456,
    "name" : "question",
    "day" : "2018-03-21",
    "field1" : 10,
    "field2" : NaN,
    "field3" : NaN,
    "field4" : NaN,
    "field5" : NaN,
    "NaNFields" : [ 
        "field2", 
        "field3", 
        "field4", 
        "field5"
    ],
    "NonNaNFields" : [ 
        "_id", 
        "name", 
        "day", 
        "field1"
    ]
}

/* 2 */
{
    "_id" : 7896321,
    "name" : "question",
    "day" : "2018-03-22",
    "field1" : NaN,
    "field2" : NaN,
    "field3" : NaN,
    "field4" : NaN,
    "field5" : 20,
    "NaNFields" : [ 
        "field1", 
        "field2", 
        "field3", 
        "field4"
    ],
    "NonNaNFields" : [ 
        "_id", 
        "name", 
        "day", 
        "field5"
    ]
}

@用户2006697使用PyMongo可以用Python的
None
替换
NaN