【问题标题】:Sorting without considering null values不考虑空值的排序
【发布时间】:2021-12-08 16:51:03
【问题描述】:

在带有节点 js 的 js 中,我想对模型中的结果进行排序,而不考虑具有 nil 值的文档,例如 产品 = [ {_id:ObjectID(), 优先级:3},

{_id:ObjectID(), 优先级:1},

{_id:ObjectID(), 优先级:2},

{_id:ObjectID()} ]

所以这个 mongo 模式所以我需要一个查询来查找排序元素 witjout 考虑到 nil 但具有 nil 值的文档必须在结果的末尾以升序或降序排列

【问题讨论】:

  • 嗨@mathewsamir。请提供示例输出,以及您为实现此类输出所做的尝试。这将明确回答最佳解决方案
  • 为了进一步澄清,我已经有了关于生产中的产品场景的数据,新的要求已经来用名为 pirority 的新字段对该产品进行排序,所以现在所有对象都没有这个新属性,所以我需要做具有此字段的对象出现在开头,其他对象出现在结尾
  • 当我使用 sorted 时,它的结果为 nil 然后对象具有 pirority 1 和 piriority 2 依此类推,我希望 pirority 1 先出现然后 2 然后在没有pirority 字段的最终对象得到它?!
  • 这是一个类似问题的答案(SO 帖子):MongoDB Custom Sorting on two fields

标签: javascript node.js mongodb


【解决方案1】:

下面是一个假设您的数据位于名为“产品”的集合中的示例。在这里,我们假设空值预计会在结果的末尾进行排序。此外,假设您希望以升序方式对优先级进行排序。

我使用任意大数 - 999999 - 来表示空值并按该值排序。

聚合

db.products.aggregate([
    {
        $addFields:
        {
            "sortField":
            {
                $ifNull: [ "$priority", 9999999 ]
            }
        }
    },
    {
        $sort: { "sortField": 1 }
    },
    {
        $project: { "sortField": 0 }
    }
])

结果

[
  { _id: ObjectId("61b0e373c6c466d7d1ea9b5b"), priority: 1 },
  { _id: ObjectId("61b0e373c6c466d7d1ea9b5c"), priority: 2 },
  { _id: ObjectId("61b0e373c6c466d7d1ea9b5a"), priority: 3 },
  { _id: ObjectId("61b0e373c6c466d7d1ea9b5d") }
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2012-06-28
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2020-06-28
    相关资源
    最近更新 更多