我在MongoDB中有类似的文件
{
"_id": "...",
"ranks":[
{"pos": 1,"type":"some type"},
{"pos": 56,"type":"other type"},
...
]
}
我想找到'ranking.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
我只是想问我是否可以通过嵌入排名来实现这一点,或者我必须将它们链接到文档。我的实验表明我必须联系。
答案 0 :(得分:3)
您正在获取单个文档,因此询问排序没有意义 - 没有在单个文档中对数组中的嵌入元素进行排序的概念。
但是,从2.1(开发版本)开始,聚合框架允许您通过选择文档$unwind
数组,然后对生成的文档进行排序(您甚至可以更改文档的一般形状)来执行您想要的操作如果需要使用$project
)的结果。
db.coll.aggregate([
{$unwind:"$ranks"},
{$match:{"ranks.type":"some type"}},
{$sort:{"ranks.pos":1}}
])
请注意,这些不是您的完整原始文档,它们是每个只有一个“rank”嵌入元素的文档,这就是为什么它们现在可以在嵌入字段中排序。
如果此类操作对您的应用程序不可或缺,那么您拥有的架构设计可能不是最佳选择。我建议查看应用程序对这些对象的查询和访问模式的类型,以防更改模式可以显着简化操作。