Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 按最大数组字段排序,升序或降序_Mongodb_Meteor_Mongodb Query_Aggregation Framework - Fatal编程技术网

Mongodb 按最大数组字段排序,升序或降序

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”, “姓名”:“奎南圣职”, “修订”:[ { “评

在我的Meteor应用程序中,我有一组文档,其中包含一系列子文档,如下所示:

/*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功能不好:(

您在这里提出的问题的基本问题归结为这样一个事实,即所讨论的数据在一个“数组”中,因此MongoDB对如何处理这些数据做出了一些基本假设

如果您应用了“降序”排序,那么MongoDB将完全按照您的要求进行排序,并按照数组中指定字段的“最大”值对文档进行排序:

.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”,