【问题标题】:How to sort documents by custom (non-natural ordered) field如何按自定义(非自然排序)字段对文档进行排序
【发布时间】:2017-03-17 14:45:26
【问题描述】:

我正在试验 MongoDB 及其聚合框架。通过展开操作,我可以将具有数组字段的文档拆分为每个数组索引的多个文档。现在如果数组中的数据没有自然排序顺序,我该如何在 MongoDB 中对其进行排序?

例子:

产品集合具有以下文档(_id 字段省略)

{ "type" : "t-shirt", "size" : [ "S", "M", "L" ] }
{ "type" : "pants", "size" : [ "XS", "S", "M", "L", "XL" ] }

通过size字段展开收集数据后,结果为

{ "type" : "t-shirt", "size" : "S" }
{ "type" : "t-shirt", "size" : "M" }
{ "type" : "t-shirt", "size" : "L" }
{ "type" : "pants", "size" : "XS" }
{ "type" : "pants", "size" : "S" }
{ "type" : "pants", "size" : "M" }
{ "type" : "pants", "size" : "L" }
{ "type" : "pants", "size" : "XL" }

size 字段没有自然排序,例如 XL 和 XS 彼此相邻排序,尽管它们应该排序到第一个/最后一个位置。

migth通过首先将每个尺寸投影到其对应的数字来解决这个问题,即 XS=1, S=2...但是有没有更简单的方法来执行自定义排序?

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework mongodb-aggregation


    【解决方案1】:

    是的,没有更简单的方法,但你有三种方法可以做到,

    1) 正如您所指定的,您可以使用 $project 并根据大小放置数字 123 并按该数字排序

    2)您可以通过 substr 2 字符对大小字符串 asc 的第二个字符进行排序并对其进行排序

    3)使用$text根据权重排序

    【讨论】:

    • 只有$substr可以从end开始拆分,才能得到最后一位,表示实际大小。但这并不能完全解决问题,因为“XS”和“S”将被同等对待。
    • 你能解释一下,$text 在这种情况下如何使用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    相关资源
    最近更新 更多