[英]How to filter a MongoDB/Mongoose query based upon referenced subdocuments values
[英]How To Sort mongodb query results based on subdocuments
我在 mongodb 數據庫中的分數集合(學生)數據庫中有 2 個文檔,如下所示。
{
id: 2,
type: 'newname',
subs: [
{ time: 20, val: 'b' },
{ time: 12, val: 'a' },
{ time: 30, val: 'c' }
] }, {
id: 1,
type: 'strs',
subs: [
{ time: 50, val: 'be' },
{ time: 1, val: 'ab' },
{ time: 20, val: 'cs' }
] }
如何構造查詢以獲得以下結果
{
id: 1,
type: 'strs',
subs: [
{ time: 1, val: 'ab' },
{ time: 20, val: 'cs' },
{ time: 50, val: 'be' }
]
},
{
id: 2,
type: 'newname',
subs: [
{ time: 12, val: 'a' },
{ time: 20, val: 'b' },
{ time: 30, val: 'c' }
]
}
即:根據時間查找文檔的查詢,並且必須根據 2 個條件對結果進行排序
您可以使用cursor.sort()
同時對多個字段(基本上是一個組合cursor.sort()
進行排序,但我認為它在同時對文檔和子文檔字段進行排序時不起作用。 如果您要對頂部文檔的兩個不同字段或子文檔的兩個不同字段進行排序,那么我猜就可以了。
因此,您可以使用聚合框架獲得類似的輸出。 您所要做的基本上就是分解subs
字段的數組,然后對它們進行排序。
你可以這樣做:
db.col.aggregate({$unwind:'subs'}, {$sort:{id:1,'subs.time':1}});
使用上面的代碼,您應該得到類似於以下內容的輸出:
{
id: 1,
type: 'strs',
subs:
{ time: 1, val: 'ab' }
},{
id: 1,
type: 'strs',
subs:
{ time: 20, val: 'cs' }
},{
id: 1,
type: 'strs',
subs:
{ time: 50, val: 'be' }
},{
id: 2,
type: 'newname',
subs:
{ time: 12, val: 'a' }
},{
id: 2,
type: 'newname',
subs:
{ time: 20, val: 'b' }
},{
id: 2,
type: 'newname',
subs:
{ time: 30, val: 'c' }
}
奇怪的是,MongoDB 並沒有提供任何通過查詢對子文檔進行排序的方法。 看來您必須更新子文檔的自然排序順序,如下所示:
如果這些是您收藏中僅有的 2 個文檔,請寫下查詢:
db.test.update( {}, {$push : {"subs" :{$each : [] , $sort : {time : -1}}}})
然后運行查詢以對 ID 本身進行排序:
db.test.find().sort({'id':1}).pretty()
您將獲得以下輸出。
{
"id" : 1,
"type" : "strs",
"subs" : [
{
"time" : 50,
"val" : "be"
},
{
"time" : 20,
"val" : "cs"
},
{
"time" : 1,
"val" : "ab"
}
]
}
{
"id" : 2,
"type" : "newname",
"subs" : [
{
"time" : 30,
"val" : "c"
},
{
"time" : 20,
"val" : "b"
},
{
"time" : 12,
"val" : "a"
}
]
}
希望它能解決你的情況。 以下是參考:
可以按順序使用$unwind
> $sort
> $group
special for array,
subs
db.collection.aggregate([
{ $unwind: "$subs" },
subs.time
升序(1) { $sort: { "subs.time": 1 } },
id
,並使用$push
對象重新構建subs
數組,其他字段仍然使用$first
{
$group: {
_id: "$id",
id: { $first: "$id" },
type: { $first: "$type" },
subs: { $push: "$subs" }
}
},
_id
{ $project: { _id: 0 } },
$sort
按id
升序 { $sort: { id: 1 } }
])
您可以使用cursor.sort(sort)
例如:
db.collection.find().sort( { 'id': 1 } )
使用 id 按升序對結果進行排序。
有關更多詳細信息,請參閱以下鏈接。http://docs.mongodb.org/manual/reference/method/cursor.sort/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.