【问题标题】:What is the order of returned document? [duplicate]退回文件的顺序是什么? [复制]
【发布时间】:2018-12-29 06:02:51
【问题描述】:

我有一个收藏,我做这个查询:

db.getCollection("test").find(
{"$or":[{_id:NumberLong("1234")},
        {_id:NumberLong("1230")},
        {_id:NumberLong("1237")},
        {_id:NumberLong("1236")}}
)

退回的文件将按顺序排列 ?我需要这个确切的顺序(其中是$or 语句的顺序):

1234
1230
1237
1236

通常这是我执行上一个查询时看到的顺序,但今天我看到一个查询返回了不同的顺序(这只是一次,因为在我重新启动服务器后,顺序又好了)。那么该怎么做才能得到我需要的确切顺序呢?

【问题讨论】:

  • 除非您明确说明,否则无法保证;除非另有说明,否则它将是他们被发现的任何顺序。您可以在图书馆的文档中阅读有关订购选项的信息。

标签: mongodb mongodb-query


【解决方案1】:

您必须使用$sort 来确保按您想要的顺序返回结果。由于您的模型中没有“排序”字段的自然候选者,您可以使用 $addFields 并添加临时字段仅用于 $sort 目的。可以使用$indexOfArray 运算符对其进行评估。您也可以使用该字段进行过滤(如果没有匹配项,$indexOfArray 将返回 -1

db.test.aggregate([
    {
        $addFields: {
            order: { $indexOfArray: [ [NumberLong("1234"), NumberLong("1230"), NumberLong("1237"), NumberLong("1236") ], "$_id" ] }
        }
    },
    {
        $match: { order: { $ne: -1 } }
    },
    {
        $sort: { order:1 }
    },
    {
        $project: { order: 0 }
    }
])

【讨论】:

  • 感谢 mickl,使用 addFields 是个好主意!
猜你喜欢
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 2015-09-16
  • 1970-01-01
  • 2016-10-19
  • 2019-06-30
相关资源
最近更新 更多