2

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

我只是问我是否可以通过嵌入等级来做到这一点,或者我必须将它们链接到文档。我的实验表明我必须链接。

4

1 回答 1

3

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

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

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

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

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

于 2012-07-14T22:24:44.890 回答