Учитывая следующие документы:
{ "a": 10, "b": "X", "c" : 40 }
{ "a": 20, "b": null, "c" : 50 }
{ "a": 30, "b": "Z", "c" : 60 }
Один из способов сделать это был бы так:
db.collection.aggregate({
$addFields: {
"sortField": { // create a new field called "sortField"
$cond: { // and assign a value that depends on
if: { $ne: [ "$b", null ] }, // whether "b" is not null
then: "$a", // in which case our field shall hold the value of "a"
else: "$c" // or else it shall hold the value of "c"
}
}
}
}, {
$sort: {
"sortField": 1 // sort by our computed field
}
}, {
$project: {
"sortField": 0 // remove "sort" field if needed
}
})
Если у вас был документ без a b
поле, как в:
{ "a": 20, "c" : 50 }
, тогда вам нужно будет применить один из методов, упомянутых здесь .
Итак, ваша if
часть внутри *Например, 1018 * может выглядеть так:
if: { $ne: [ "$b", undefined ] }, // whether "b" is null or doesn't exist at all