是否有可能在聚合框架中以投影顺序获取字段mongo

时间:2016-02-07 13:33:48

标签: mongodb mongodb-query aggregation-framework

我有以下文件:

{ "_id" : 3, "quizzes" : [ 4, 5, 5 ], "labs" : [ 6, 5 ], "final" : 78, "midterm" : 70 }
{ "_id" : 1, "quizzes" : [ 4, 5, 5 ], "labs" : [ 6, 5 ], "midterm" : 70 }

如果我运行以下查询:

   db.students.aggregate([  { "$project": {  "midterm": 1,"final": 1   } } ])

结果如下:

{ "_id" : 3, "final" : 78, "midterm" : 70 }
{ "_id" : 1, "midterm" : 70 }

如果我仍然在shell中更改投影中的顺序,那么这些字段的顺序是一样的吗?我们可以根据查询的顺序重新获得订单吗?

db.students.aggregate([  { "$project": { "final":1, "midterm": 1  } } ])
{ "_id" : 3, "final" : 78, "midterm" : 70 }
{ "_id" : 1, "midterm" : 70 }

用例为什么订单很重要:

我有一个集合,用于存储用户的日常数据。如果用户当天做了一些活动,那么该用户的文档中会有一个字段。我们将这一天存储200天...再来一个集合我们必须在过去200天内更新userFirstActive的时间......

注意:在用户没有执行任何活动的那天,该密钥不会有任何条目......

因此,如果我们进行了200天的投影......除了id之外的第一个条目将是第一个活跃的日子..是否可以在不获取整个文档的情况下实现此目的并检查密钥是否存在?< / p>

1 个答案:

答案 0 :(得分:12)

MongoDB默认按插入顺序返回字段。

e.g。

db.students.aggregate([  { "$project": {  "midterm": 1,"final": 1   } } ])

将返回

{ "_id" : 3, "final" : 78, "midterm" : 70 }
{ "_id" : 2, "midterm" : 60, "final" : 55 }
{ "_id" : 1, "midterm" : 70 }

你可以看到第二条记录,它的字段按我们插入的顺序排列。 但是,我们可以通过重命名字段来按照您的要求播放它们。

e.g。

db.students.aggregate([  { "$project": {  _midterm:"$midterm","_final": "$final"}}])

以上查询将返回

{ "_id" : 3, "_midterm" : 70, "_final" : 78 }
{ "_id" : 2, "_midterm" : 60, "_final" : 55 }
{ "_id" : 1, "_midterm" : 70 }

这里midterm是第一名,而final是第二名,有一个例外。字段名称以_为前缀。如果您想要原始名称,可以再次project

db.students.aggregate(
[
{ "$project": {  _midterm:"$midterm","_final": "$final"}},
{ "$project": {  midterm:"$_midterm","final": "$_final"}}
])

它会返回

{ "_id" : 3, "midterm" : 70, "final" : 78 }
{ "_id" : 2, "midterm" : 60, "final" : 55 }
{ "_id" : 1, "midterm" : 70 }