【发布时间】:2014-06-23 08:16:59
【问题描述】:
我正在尝试根据一个字段对文档集合进行排序,该字段是子文档的子文档的字段。
这是我的文档的一个非常简化的版本:
{
"_id": ObjectId("536900cdb4f805efff8b075b"),
"name": "el1",
"versions": [{
"releases": [{
"rd": ISODate("2064-05-05T15:36:10.098Z")
}, {
"rd": ISODate("2014-05-01T16:00:00Z")
}]
}, {
"releases": [{
"rd": ISODate("2064-05-04T15:36:10.098Z")
}, {
"rd": ISODate("2014-05-01T14:00:00Z")
}]
}]
}, {
"_id": ObjectId("536900f2b4f805efff8b075c"),
"name": "el2",
"versions": [{
"releases": [{
"rd": ISODate("2064-05-05T15:36:10.098Z")
}, {
"rd": ISODate("2014-05-01T17:00:00Z")
}]
}]
}
如您所见,每个文档可能有名为version 的子文档,每个version 可能有多个名为release 的子文档。我想根据rd 字段对主要文档进行排序,同时从sort 计算中排除所有超过一年的日期。我不关心在主文档中对子文档进行排序。
即ISODate("2064-05-05T15:36:10.098Z") 应该被忽略,因为太远了,而 ISODate("2014-05-01T16:00:00Z") 很好。 “忽略”是指:不要在排序计算中使用该值,也不要:从结果中删除该文档。
我尝试了几种方法,包括map-reduce 和aggregation framework,但都失败了。
这应该是成功排序的输出:
{
"_id": ObjectId("536900f2b4f805efff8b075c"),
"name": "el2",
"versions": [{
"releases": [{
"rd": ISODate("2064-05-05T15:36:10.098Z")
}, {
"rd": ISODate("2014-05-01T17:00:00Z")
}]
}]
}, {
"_id": ObjectId("536900cdb4f805efff8b075b"),
"name": "el1",
"versions": [{
"releases": [{
"rd": ISODate("2064-05-05T15:36:10.098Z")
}, {
"rd": ISODate("2014-05-01T16:00:00Z")
}]
}, {
"releases": [{
"rd": ISODate("2064-05-04T15:36:10.098Z")
}, {
"rd": ISODate("2014-05-01T14:00:00Z")
}]
}]
}
【问题讨论】:
标签: ruby-on-rails mongodb sorting mongoid