在MongoDB中,有一个对象列表,通过查询同一对象的另一个字段的值,根据对象的一个​​字段的值对所有文档进行排序

In MongoDB,having a list of objects, sort all documents based on value of one field of an object by querying value of another field of the same object

我有一个要在查询中使用的变量。我希望能够根据与键存在于同一对象中的值对集合中的所有文档进行排序。 例如 我有 2 个文件如下:

文档 1:

{
  "_id": "Document 1",
  "data": {
    "list_of_data": [
      {
        "key": "KEY_1",
        "value": "value A",
        "valueId": "1234"
      },
      {
        "key": "KEY_2",
        "value": "value B",
        "valueId": "1235"
      },
      {
        "key": "KEY_3",
        "value": "value C",
        "valueId": "1236"
      }
    ]
  }
}

文档 2:

{
  "_id": "Document 2",
  "data": {
    "list_of_data": [
      {
        "key": "KEY_1",
        "value": "value B",
        "valueId": "1236"
      },
      {
        "key": "KEY_2",
        "value": "value A",
        "valueId": "1237"
      },
      {
        "key": "KEY_3",
        "value": "value C",
        "valueId": "1238"
      }
    ]
  }
}

我的查询接受“关键”数据,我希望能够根据该特定对象中的“值”字段对所有文档进行排序。 例如,如果我将“key”发送为“KEY_1”并且我希望它按升序排序,则输出应如下所示:

[
  {
    "_id": "Document 1",
    "data": {
      "list_of_data": [
        {
          "key": "KEY_1",
          "value": "value A",
          "valueId": "1234"
        },
        {
          "key": "KEY_2",
          "value": "value B",
          "valueId": "1235"
        },
        {
          "key": "KEY_3",
          "value": "value C",
          "valueId": "1236"
        }
      ]
    }
  },
  {
    "_id": "Document 2",
    "data": {
      "list_of_data": [
        {
          "key": "KEY_1",
          "value": "value B",
          "valueId": "1236"
        },
        {
          "key": "KEY_2",
          "value": "value A",
          "valueId": "1237"
        },
        {
          "key": "KEY_3",
          "value": "value C",
          "valueId": "1238"
        }
      ]
    }
  }
]

这是因为对于“KEY_1”,第一个文档具有 value A,而第二个文档具有 value B文件.

但是,如果我按升序搜索“KEY_2”,输出应该如下:

[
  {
    "_id": "Document 2",
    "data": {
      "list_of_data": [
        {
          "key": "KEY_1",
          "value": "value B",
          "valueId": "1236"
        },
        {
          "key": "KEY_2",
          "value": "value A",
          "valueId": "1237"
        },
        {
          "key": "KEY_3",
          "value": "value C",
          "valueId": "1238"
        }
      ]
    }
  },
  {
    "_id": "Document 1",
    "data": {
      "list_of_data": [
        {
          "key": "KEY_1",
          "value": "value A",
          "valueId": "1234"
        },
        {
          "key": "KEY_2",
          "value": "value B",
          "valueId": "1235"
        },
        {
          "key": "KEY_3",
          "value": "value C",
          "valueId": "1236"
        }
      ]
    }
  }
]

这是因为对于“KEY_2”,第一个文档具有 value B,而第二个文档具有 value A文件.

有什么想法吗?

这是您可以做到的一种方法。

db.collection.aggregate([
  {
    "$set": {
      "sortVal": {
        "$reduce": {
          "input": "$data.list_of_data",
          "initialValue": "",
          "in": {
            "$cond": [
              {
                "$eq": [
                  "$$this.key",
                  "KEY_1"  // sort key
                ]
              },
              "$$this.value",
              "$$value"
            ]
          }
        }
      }
    }
  },
  { "$sort": { "sortVal": 1 } },
  { "$unset": "sortVal" }
])

mongoplayground.net 上试用。