按Mongo中嵌套数组中的文档值排序

时间:2014-09-08 16:13:13

标签: mongodb mongodb-query

我有一个名为Objects的集合。每个Object文档都有一个称为属性的嵌套文档数组。每个属性文档都有一个名称和值。

例如,假设我有这两个对象,每个对象都有两个属性(高度和宽度)。我如何按高度对物体进行排序?

{
  "id": 1,
  "properties": [
    {
      "name": "height",
      "value": 170
    },
    {
      "name": "width",
      "value": 200
    },
  ]
},
{
  "id": 2,
  "properties": [
    {
      "name": "height",
      "value": 100
    },
    {
      "name": "width",
      "value": 300
    },
  ]
}

1 个答案:

答案 0 :(得分:5)

在大多数情况下,只要您处理数组,MongoDB的aggregation framework就是您的朋友。查看可用于将阵列分解为单个文档的$unwind运算符。我在下面发布了一个示例查询,按height对文档进行排序。请注意,您可以在聚合管道中使用$project运算符来更好地格式化结果。

db.objects.aggregate([
    // De-normalize the 'properties' array
    {$unwind:"$properties"}, 
    // Filter for only height
    {$match:{"properties.name":"height"}},
    // Sort by 'height' in ascending order.  Use -1 for descending 
    {$sort:{"properties.value":1}}
])

编辑:保持properties元素完好无损的一种方法是制作它的副本,以便用于排序。一个例子如下:

db.objects.aggregate([
    // Make a copy of the 'properties' element
    {$project:{properties:1, sortfield:"$properties"}}, 
    {$unwind:"$sortfield"}, 
    {$match:{"sortfield.name":"height"}}, 
    {$sort:{"sortfield.value":1}}, 
    // Get rid of 'sortfield' 
    {$project:{properties:1}}
])