2012-07-14 153 views
2

我在MongoDB的文件看起來像這樣MongoDB的排序字段,將查詢

{ 
    "_id": "...", 
    "ranks":[ 
    {"pos": 1,"type":"some type"}, 
    {"pos": 56,"type":"other type"}, 
    ... 
    ] 
} 

我想找個地方「ranks.type」「某種類型的」匹配的所有項目,並通過「對它們進行排序pos'在這個嵌入式文檔中。

在SQL我會做這樣的事情(表文件和document_rank)

SELECT 
    D.* 
FROM 
    document D 
JOIN 
    document_rank DR ON DR.document_id = D.id 
WHERE 
    DR.type="some type" 
ORDER BY 
    DR.pos 

我只是詢問我是否可以通過嵌入行列做到這一點還是我必須將它們鏈接到文件。我的實驗表明我必須鏈接。

回答

3

您正在取回單個文檔,所以詢問排序沒有意義 - 在單個文檔中沒有對數組中的嵌入元素進行排序的概念。但是,從2.1(開發版本)開始,聚合框架允許您通過讓您選擇文檔,$unwind數組,然後對結果文檔進行排序來完成您想要的操作(甚至可以更改結果的一般形狀if需要使用$project)。

db.coll.aggregate([ 
     {$unwind:"$ranks"}, 
     {$match:{"ranks.type":"some type"}}, 
     {$sort:{"ranks.pos":1}} 
]) 

注意,這些都是不完整的原始憑證,他們只有一個文件「行列」嵌件分別,這就是爲什麼他們能夠在嵌入式領域現在進行排序。

如果此類操作對您的應用程序是不可或缺的,那麼您擁有的模式設計可能不是最佳選擇。我建議您查看應用程序將使用這些對象的查詢和訪問模式的類型,以防更改模式將大大簡化事情。

+0

我會將行列存儲在不同的集合中,並將它們鏈接到文檔。我認爲這會容易得多。 – chatoooo 2012-07-14 22:37:19