MongoDB在嵌入式中按字段排序,与查询匹配

时间:2012-07-14 21:42:05

标签: mongodb sorting

我在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

我只是想问我是否可以通过嵌入排名来实现这一点,或者我必须将它们链接到文档。我的实验表明我必须联系。

1 个答案:

答案 0 :(得分:3)

您正在获取单个文档,因此询问排序没有意义 - 没有在单个文档中对数组中的嵌入元素进行排序的概念。

但是,从2.1(开发版本)开始,聚合框架允许您通过选择文档$unwind数组,然后对生成的文档进行排序(您甚至可以更改文档的一般形状)来执行您想要的操作如果需要使用$project)的结果。

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

请注意,这些不是您的完整原始文档,它们是每个只有一个“rank”嵌入元素的文档,这就是为什么它们现在可以在嵌入字段中排序。

如果此类操作对您的应用程序不可或缺,那么您拥有的架构设计可能不是最佳选择。我建议查看应用程序对这些对象的查询和访问模式的类型,以防更改模式可以显着简化操作。