我有类似的文件:
Name | lastname | age | code | value
--------+-------------------+-----------+----------+--------
aaaaa | zzzzzzzzz | 10 | 1 | 11
bbbb | eeeeeeeee | 20 | 2 | 22
aaaaa | zzzzzzzzzzz | 10 | 3 | null
dddd | nnnnnnnn | 20 | 4 | null
aaaaa | zzzzzzzzzzz | 10 | 5 | null
bbbb | eeeeeeeee | 20 | 6 | null
aaaaa | zzzzzzzzzzz | 10 | 7 | 77
使用MongoDB,我正在寻找给出该结果的请求:
检测具有空值的那些
将它们分组(仅为null
值)并将所有代码写入一个字段:all_code
;
检测是否存在其他相似的值不为null的相似项,并将它们与第2点的值分组,然后将所有这些值放入新的field=all_value
中。
因此,它将类似于:
Name | lastname | age | all_code | all_values
--------+------------------+------------+----------------+------------
aaaaa | zzzzzzzzz | 10 | 3 , 5 | 11,77
bbbb | eeeeeeeee | 20 | 6 | 22
dddd | nnnnnnnn | 20 | 4 | null
我已经尝试过了:
db.information.aggregate([
{$group:
{
_id:{
name : "$name",
lastename: "$lastename",
age: "$age"
},
total:{$sum: 1},
all_code:{ $addToSet: "$code" },
all_values:{ $addToSet: "$value" }}},
{ $project:
{
"name": 1,
"lastename":1,
"age":1,
"all_code":1,
"all_values":1,
"total":1
}},
{ $sort:{"total":-1}}
])
但是问题在于all_code
列中,女巫必须仅在value = null
处显示代码,并为已经有价值的人显示值。
答案 0 :(得分:0)
所以,我认为这会起作用。我不确定,答案似乎太简单了,但是在Mongo中,我相信您想将{$ group}和{$ match}阶段分开,所以您只需在{$之前添加一个{$ match}阶段组}。如果您来自SQL环境,这可能会令人困惑,但这是休息时间。最后,我认为这在某种程度上会带来更灵活,更强大的结果。无论如何,我认为这可以解决您的问题:
db.information.aggregate([
{ $group:
{
_id: {
name : "$name",
lastename: "$lastename",
age: "$age"
},
total: {$sum: 1},
all_code: { $addToSet: "$code" },
all_values: {"$cond" : [{"$eq": [null, "$value"]} , null, {$addToSet: "$value"} }},
{ $project:
{
"name": 1,
"lastename":1,
"age":1,
"all_code":1,
"all_values":1,
"total":1
}},
{ $sort:{"total":-1}}
])