我想基於字段是一個子文檔的子文檔字段排序文檔的集合。MongoDB按子文檔值排序
這裏是我的文檔的一個非常簡化的版本:
{
"_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")
}]
}]
}
哇,'sort_key'方法看起來很有趣,從來沒有使用過這一點。肯定會嘗試一下。實際上,我通過創建一個名稱和max不大於1y的哈希集合並按它排序的方式,在mongoid的rails中完成此操作。我接受你的答案,因爲你提供了2個工作解決方案:D – Oktav
很高興能夠幫助並聽到你正在放大。 –