我目前正在MongoDB中开发一个解决方案,其中在同一集合中有两个不同的数据架构。问题在于某些数据具有不同的字段名称。例如:
在其中一个合同中,日期被命名为:date_at
,在另一种合同中,日期被命名为date
。
所以问题是:如何在一个字段上进行排序,如果文档中不存在该字段,请在另一个字段上进行排序?
当前,我正在尝试进行如下查询:
db.collection('contracts').aggregate([
{$project: {
date_at: [ $ifNull: ['$date', null]
}},
{$sort: { date_at: -1 }}
]);
但是它似乎不起作用。希望你们中的一个能够帮助我。预先谢谢你。
答案 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/