我有这样的文件:
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
;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
的代码,并为那些已经有价值的人提供价值。
所以,我认为这会奏效。我不确定,这似乎是一个简单的答案,但在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}}
])