【问题标题】:Multiple sorting in aggregate with mongo使用 mongo 聚合多个排序
【发布时间】: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 的重命名字段...谢谢!

标签: mongodb sorting aggregate


【解决方案1】:

正如@Neil Lunn 所说: 它们没有正确排序,因为您重命名了 $project 中的字段。所以应该是 { $sort: { state: 1, date: 1 } }

【讨论】:

    猜你喜欢
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多