Mongodb 按最大数组字段排序,升序或降序
在我的Meteor应用程序中,我有一组文档,其中包含一系列子文档,如下所示:Mongodb 按最大数组字段排序,升序或降序,mongodb,meteor,mongodb-query,aggregation-framework,Mongodb,Meteor,Mongodb Query,Aggregation Framework,在我的Meteor应用程序中,我有一组文档,其中包含一系列子文档,如下所示: /*1*/ { “_id”:“5xF9iDTj3reLDKNHh”, “名称”:“Lorem ipsum”, “修订”:[ { “数字”:0, “评论”:“Dolor sit amet”, “创建”:ISODate(“2016-02-11T01:22:45.588Z”) } ], “数字”:1 } /* 2 */ { “_id”:“qTF8kEphNoB3eTNRA”, “姓名”:“奎南圣职”, “修订”:[ { “评
/*1*/
{
“_id”:“5xF9iDTj3reLDKNHh”,
“名称”:“Lorem ipsum”,
“修订”:[
{
“数字”:0,
“评论”:“Dolor sit amet”,
“创建”:ISODate(“2016-02-11T01:22:45.588Z”)
}
],
“数字”:1
}
/* 2 */
{
“_id”:“qTF8kEphNoB3eTNRA”,
“姓名”:“奎南圣职”,
“修订”:[
{
“评论”:“poderiquem酒店”,
“数字”:1,
“已创建”:ISO日期(“2016-02-11T23:25:46.033Z”)
},
{
“数字”:0,
“评论”:“Fagor questibilus”,
“创建”:ISODate(“2016-02-11T01:22:45.588Z”)
}
],
“数字”:2
}
我要做的是查询此集合,并在修订版
数组的已创建
字段中按最长日期对结果集进行排序。一些我还没能完成的事情。我的一些限制是:
- 仅按
修订进行排序。创建的
不会剪切它,因为集合中使用的日期取决于排序方向。无论排序顺序如何,我都必须在集合中使用最大日期
- 我不能依赖于对未排序结果集的查询后操作,因此,这必须通过数据库的适当查询或聚合来完成李>
- 无法保证
数组将被预先排序修订版
- 某些文档中可能有额外的字段,这些字段必须附带,因此请小心使用
$project
- Meteor仍在使用MongoDB 2.6,较新的API功能不好:(
.sort({“revisions.created”:-1))
但是,如果你改为按“升序”排序,那么当然是相反的,并且考虑“最小”的值
.sort({“revisions.created”:1})
因此,唯一的方法是从数组中的数据中计算出最长日期,然后对结果进行排序。这基本上意味着应用.aggregate()
,对于meteor来说,这是一个服务器端操作,不幸的是,类似这样的操作:
Collection.aggregate([
{“$REWIND”:“$revisions”},
{“$组”:{
“\u id”:“$\u id”,
“名称”:{“$first”:“$name”},
“修订版”:{“$push”:“$revisions”},
“编号”:{“$first”:“$number”}
“maxDate”:{“$max”:“$revisions.created”}
}},
{“$sort”:{“maxDate”:1}
])
或者最好使用MongoDB 3.2,其中可以直接应用于数组表达式:
Collection.aggregate([
{“$project”:{
“名称”:1,
"修订":一,,
“数字”:1,
“maxDate”:{
“$max”:{
“$map”:{
“输入”:“$revisions”,
“as”:“el”,
“在”:“$$el.created”
}
}
}
}},
{“$sort”:{“maxDate”:1}
])
但实际上这两种方法都不是很好,即使MongoDB 3.2方法的开销比以前的版本小得多,但由于需要传递数据并计算出排序值,因此在性能方面仍然不如您所能获得的好
因此,为了获得最佳性能,“始终”将您需要的数据保存在数组的“外部”。为此,有一个运算符,它只会在“提供的值”大于现有值的情况下替换文档中的值。即:
Collection.update(
{“_id”:“qTF8kEphNoB3eTNRA”},
{
“$push”:{
“修订”:{“创建”:新日期(“2016-02-01”)}
},
“$max”:{“maxDate”:新日期(“2016-02-01”)}
}
)
这意味着您想要的值将“始终”存在于文档中,并具有预期值,因此现在只需对该字段进行简单排序:
.sort({“maxDate”:1})
因此,为了我的钱,我会使用可用的.aggregate()
语句检查现有数据,并使用这些结果更新每个文档,使其包含一个“maxDate”字段。然后更改数组数据的所有添加和修订的编码,以便在每次更改时应用该编码
如果你经常使用的话,用一个固体场而不是计算总是更有意义的。而且维护也很简单
在任何情况下,考虑到上述应用的示例日期,“小于”其他出现的最长日期,我将以各种形式返回:
{
“_id”:“5xF9iDTj3reLDKNHh”,
“名称”:“Lorem ipsum”,
“修订”:[
{
“数字”:0,
“评论”:“Dolor sit amet”,
“创建”:ISODate(“2016-02-11T01:22:45.588Z”)
}
],
“数字”:1,
“maxDate”:ISODate(“2016-02-11T01:22:45.588Z”)
}
{
“_id”:“qTF8kEphNoB3eTNRA”,
“姓名”:“奎南圣职”,
“修订”:[
{
“评论”:“poderiquem酒店”,
“数字”:1,
“已创建”:ISO日期(“2016-02-11T23:25:46.033Z”)
},
{
“数字”:0,
“评论”:“Fagor questibilus”,