MongoDB查询:列出所有具有值NaN的字段
假设MongoDB有一个包含对象“sample1”的集合,该对象具有以下字段: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
/* 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
。