mongodb - 根据字段值指定的嵌入对象的字段值对 MongoDB 集合进行排序?

标签 mongodb aggregation-framework

在 MongoDB 中,如何根据另一个字段值指定的嵌入对象的字段值对查询结果进行排序?

这是数据的表示:

{
field1 : 'value',
field2: 'value',
data: [
    fields": [
    {
    _id: "5a8fdd13de5b074d4d4f572c",
    field: "location",
    value: "Antwerp"
    },
    {
    _id: "5a8fdd13de5b074d4d4f572b",
    field: "title",
    value: "This is a good title"
    },
    {
    _id: "5a8fdd13de5b074d4d4f572a",
    field: "employmentType",
    value: "Temporary"
    }
]}

例如,我有一个包含此类文档的集合,我想根据 data.fields.value 对整个集合进行排序。我唯一拥有的是data.fields.field

我该怎么做?提前致谢!

最佳答案

您可以在 3.4 中尝试以下聚合。

这个想法是将字段投影到与字段匹配的位置。以下查询中的位置

$addFields将计算文档保留为文档中的额外字段,后跟 $sort对文档中的值字段进行排序。

$objectToArray将字段内的字段对象转换为 $filter 内的键值对数组与 $and$in匹配键(字段)和值(位置)。

$project排除删除排序文档以获取包含原始字段的文档。

$arrayElemAt将单个文档的数组转换为单个文档。

db.col.aggregate([
  {"$addFields":{
    "mfield":{
      "$arrayElemAt":{
        "$filter":{
          "input":{"$arrayElemAt":["$data.fields",0]},
          "as":"field",
          "cond":{
            "$let":{
              "vars":{"fieldkv":{"$objectToArray":"$$field"}},
              "in":{
                "$and":[
                  {"$in":["field", "$$fieldkv.k"]},
                  {"$in":["location", "$$fieldkv.v"]}
                ]
              }
          }
        }
      }
    }
  }},
  {"$sort":{"mfield.value":-1}},
  {"$project":{"mfield":0}}
])

关于mongodb - 根据字段值指定的嵌入对象的字段值对 MongoDB 集合进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48946599/

相关文章:

mysql - 数据上报、可视化和入库

javascript - 将 PassportJS 转发到表单例份验证以添加电子邮件、密码等

php - MongoDB 迭代

mongodb - 使用 MongoDB 聚合 $group 获取百分比

node.js - 如何从一个集合中具有不同状态的mongodb获取计数

mongodb - 如何删除 MongoDB 中的 _id 并替换为另一个字段作为主键?

node.js - Mongoose 在更新之前查询/检查文档

mongodb - 如何按月对文件进行分组?

node.js - 需要为每个用户获取一份文档nodejs和mongodb

node.js - Mongoose 根据经纬度信息和文本索引对文档进行排序