同时在MongoDB中对两个字段进行排序

时间:2019-03-19 16:36:47

标签: mongodb mongodb-query aggregation-framework

我目前正在MongoDB中开发一个解决方案,其中在同一集合中有两个不同的数据架构。问题在于某些数据具有不同的字段名称。例如: 在其中一个合同中,日期被命名为:date_at,在另一种合同中,日期被命名为date

所以问题是:如何在一个字段上进行排序,如果文档中不存在该字段,请在另一个字段上进行排序?

当前,我正在尝试进行如下查询:

db.collection('contracts').aggregate([
  {$project: {
    date_at: [ $ifNull: ['$date', null]
  }},
  {$sort: { date_at: -1 }}
]);

但是它似乎不起作用。希望你们中的一个能够帮助我。预先谢谢你。

2 个答案:

答案 0 :(得分:1)

$ifNull是您的解决方案:

获取以下文档集:

[
  {
    _id: 1,
    name: "c"
  },
  {
    _id: 2,
    name: "a"
  },
  {
    _id: 3,
    lastname: "b"
  },
  {
    _id: 4,
    name: "d"
  },
]

以下查询将项目名称或姓氏(如果名称不存在)作为名称,并在第二阶段按名称排序:

db.collection.aggregate([
  {
    $project: {
      name: {
        $ifNull: [
          "$name",
          "$lastname"
        ]
      }
    }
  },
  {
    $sort: {
      name: 1
    }
  }
])

将导致:

[
  {
    "_id": 2,
    "name": "a"
  },
  {
    "_id": 3,
    "name": "b"
  },
  {
    "_id": 1,
    "name": "c"
  },
  {
    "_id": 4,
    "name": "d"
  }
]

$ ifNull采用2个参数组成的数组:如果第一个为null或不存在,则使用第二个。

答案 1 :(得分:0)

听起来您需要创建一个化合物索引

复合索引由引用多个字段的单个索引组成。

注意。重要的是,复合索引中字段的顺序必须与查询排序的顺序逻辑相对应(请参见Sort Order)。

示例:

创建复合索引:

db.data.createIndex( { a:1, b: 1, c: 1, d: 1 } )

通过排序查找数据:

db.data.find().sort( { a: -1, b: -1 } )

更多信息:

https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/#sort-on-multiple-fields

https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/