【发布时间】:2017-11-07 10:09:29
【问题描述】:
当我对 mongo 使用聚合方法中的多重排序时,结果的排序方式不正确。这是我的查询:
db.MyCollection.aggregate(
{
"$unwind": "$objects"
},
{
"$lookup": {
"from": "CollectionA",
"localField": "objects.itemId",
"foreignField": "_id",
"as": "itemOne"
}
},
{
"$lookup": {
"from": "CollectionB",
"localField": "user_id",
"foreignField": "id",
"as": "users"
}
},
{
"$lookup": {
"from": "CollectionC",
"localField": "objects.itemName",
"foreignField": "name",
"as": "itemTwo"
}
},
{
"$addFields": {
"item": {
"$arrayElemAt": [
"$itemOne",
0
]
},
"user": {
"$arrayElemAt": [
"$users",
0
]
},
"itemP": {
"$arrayElemAt": [
"$itemTwo",
0
]
}
}
},
{
"$addFields": {
"itemName": {
"$ifNull": [
"$item.name",
"$objects.itemName"
]
},
"userName": {
"$concat": [
"$user.firstname",
" ",
"$user.lastname"
]
}
}
},
{
"$match": {
"client_id": 2
}
},
{
"$skip": 1
},
{
"$limit": 10
},
{
"$project": {
"date": "$objects.date",
"state": "$objects.state"
}
},
{
"$sort": {
"objects.state": 1,
"objects.date": 1,
}
}
)
准确地说:“日期”字段是日期类型,“状态”字段是数字类型。 如果我只使用一种:结果顺序是正确的。但是,如果我使用 2 种,则结果的顺序不正确。你有什么想法吗,为什么?
【问题讨论】:
-
“结果排序不正确”是什么意思?请添加查询的当前结果和预期输出
-
它们没有正确排序,因为您重命名了
$project中的字段。所以应该是{ $sort: { state: 1, date: 1 } }。不太确定您是否意识到仅这些字段正在被返回。坦率地说,在所有$addFields阶段“添加新字段”然后丢弃它们之后,让$project没有任何意义。所以你似乎在这里遗漏了一些概念。 -
@NeilLunn 完美!我忘记了 $project 的重命名字段...谢谢!