【问题标题】:MongoDB sort with conditionsMongoDB 条件排序
【发布时间】:2022-01-10 08:17:52
【问题描述】:

我有这样的收藏:

{ 
    "_id" : 13965 ,
    "name" : "p 1",
    "sort_order" : 0,
    "quantity" : 5 
}
{ 
    "_id" : 8000 ,
    "name" : "p 4",
    "sort_order" : 500,
    "quantity" : -10
}
{ 
    "_id" : 13980 ,
    "name" : "p 2",
    "sort_order" : 50,
    "quantity" : 2
}
{ 
    "_id" : 9753 ,
    "name" : "p 5",
    "sort_order" : 0,
    "quantity" : 0
}
{ 
    "_id" : 2000 ,
    "name" : "p 3",
    "sort_order" : 6,
    "quantity" : 1
}
{ 
    "_id" : 65230,
    "name" : "p 6",
    "sort_order" : 20,
    "quantity" : 0
}

排序后,我希望它看起来像这样:

{ 
    "_id" : 13980 ,
    "name" : "p 2",
    "sort_order" : 50,
    "quantity" : 2
}

{ 
    "_id" : 2000 ,
    "name" : "p 3",
    "sort_order" : 6,
    "quantity" : 1
}

{ 
    "_id" : 13965 ,
    "name" : "p 1",
    "sort_order" : 0,
    "quantity" : 5 
}

{ 
    "_id" : 8000 ,
    "name" : "p 4",
    "sort_order" : 500,
    "quantity" : -10
}

{ 
    "_id" : 65230,
    "name" : "p 6",
    "sort_order" : 20,
    "quantity" : 0
}

{ 
    "_id" : 9753 ,
    "name" : "p 5",
    "sort_order" : 0,
    "quantity" : 0
}

我希望quantity 为零或小于零的所有情况都位于列表的末尾,其余情况按sort_order 排序。这个Mysql查询工作:

SELECT product_id,quantity,sort_order FROM product ORDER by quantity

但我需要mongoDB :))

【问题讨论】:

  • 到目前为止你尝试过什么?你被困在哪里了?为什么这个问题用 PHP 标记,但不包含任何 PHP 代码?
  • @NicoHaase ,我想用 php 代码回答。
  • 那么请分享您解决问题的尝试

标签: php mysql database mongodb sorting


【解决方案1】:

试试这个:

db.collection.aggregate([
  {
    $addFields: {
      sortQuantity: { $cond: [ { $lte: ["$quantity", 0 ] }, 0, 1 ] }
    }
  },
  {
    $sort: {
      sortQuantity: 1,
      sort_order: -1
    }
  },
  { $unset: "sortQuantity" }
])

Mongo Playground

【讨论】:

  • 非常感谢。你也可以给我PHP代码吗?
  • SO 不是免费的编码服务。看看stackoverflow.com/questions/14131833/… 的转变是相当明显的。您还可以将整个 JSON 字符串传递给 toPHPfromJSON,例如 toPHP(fromJSON( '[{$addFields ...]' ))
【解决方案2】:

你可以使用

  • $facet 将传入数据分类为 quantity>0quantity <=0
  • $sort 按预期排序
  • $concatArray 将两个数组合并为一个数组
  • $unwind 解构数组
  • $replaceRoot 将解构后的变量设为root

这里是 ocde

db.collection.aggregate([
  {
    "$facet": {
      "lteZero": [
        {
          $match: {
            $expr: {
              $lte: [ "$quantity", 0 ]
            }
          }
        },
        { $sort: { sort_order: -1, quantity: 1 } }
      ],
      "gtZero": [
        {
          $match: {
            $expr: {
              $gt: [ "$quantity", 0 ]
            }
          }
        },
        { $sort: { sort_order: -1, quantity: 1 } }
      ]
    }
  },
  {
    "$project": {
      combined: {
        "$concatArrays": [ "$gtZero", "$lteZero" ]
      }
    }
  },
  { "$unwind": "$combined" },
  { "$replaceRoot": { "newRoot": "$combined" } }
])

工作Mongo playground

【讨论】:

  • 对于简单的排序来说可能有点过头了。
  • @WernfriedDomscheit 是的,可能是,但这是他的预期输出,这就是我使用这种方式的原因
【解决方案3】:

简单易行,你可以使用 cursor.sort() 函数对集合进行排序:

db.collection.find().sort({数量:-1})

这些示例返回名为 collection 的集合中的所有文档,这些文档按数量字段按降序排列。为 $orderby 指定一个负值(例如 -1,如上所述)以降序排序,或指定一个正值(例如 1)以升序排序。

欲了解更多信息,请访问: https://docs.mongodb.com/manual/reference/method/cursor.sort/

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 2018-07-17
    相关资源
    最近更新 更多