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

Mongodb 在Mongo中按嵌套数组中的文档值排序,mongodb,mongodb-query,Mongodb,Mongodb Query,我有一个叫做对象的集合。每个对象文档都有一个称为属性的嵌套文档数组。每个属性文档都有一个名称和一个值 例如,假设我有两个对象,每个对象都有两个属性(高度和宽度)。我将如何按高度对对象进行排序 { "id": 1, "properties": [ { "name": "height", "value": 170 }, { "name": "width", "value": 200 }, ] }, { "

我有一个叫做对象的集合。每个对象文档都有一个称为属性的嵌套文档数组。每个属性文档都有一个名称和一个值

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

{
  "id": 1,
  "properties": [
    {
      "name": "height",
      "value": 170
    },
    {
      "name": "width",
      "value": 200
    },
  ]
},
{
  "id": 2,
  "properties": [
    {
      "name": "height",
      "value": 100
    },
    {
      "name": "width",
      "value": 300
    },
  ]
}
在大多数情况下,无论何时处理数组,MongoDB都是您的朋友。请看一看可用于将数组分解为单个文档的运算符。我在下面发布了一个示例查询,用于按
高度对文档进行排序。请注意,您可以在聚合管道中使用
$project
操作符来更好地格式化结果

db.objects.aggregate([
//反规范化“属性”数组
{$unwind:“$properties”},
//仅用于高度的过滤器
{$match:{“properties.name”:“height”},
//按“高度”升序排序。使用-1进行降序
{$sort:{“properties.value”:1}
])
编辑:保持
属性
元素完好无损的一种方法是复制该元素以用于排序。一个例子如下:

db.objects.aggregate([
//制作“属性”元素的副本
{$project:{properties:1,排序字段:“$properties”},
{$unwind:$sortfield},
{$match:{“sortfield.name”:“height”},
{$sort:{“sortfield.value”:1},
//摆脱“索特菲尔德”
{$project:{properties:1}}
])

难道你不能让mongodb返回数组,然后对其进行排序吗?不,集合太大,无法在应用程序中提取和排序。你可以使用mongodb来实现这一点。我将很快发布一个示例查询。它返回的对象没有其他属性(只有高度,但没有宽度)。有没有办法将它们包含在结果中,或者我需要在后续查询中提取它们?@Marjan,我已经更新了我的答案,以包含另一个查询,该查询将保持其余属性不变。就是这样。谢谢你,先生!