Mongo的distinct方法默认的排序是怎样的?

问题描述 投票:0回答:2

我的库存收集如下:

{ "_id": 1, "dept": "A", "item": { "sku": "111", "color": "red" }, "sizes": [ "S", "M" ] }
{ "_id": 2, "dept": "A", "item": { "sku": "111", "color": "blue" }, "sizes": [ "M", "L" ] }
{ "_id": 3, "dept": "B", "item": { "sku": "222", "color": "blue" }, "sizes": "S" }
{ "_id": 4, "dept": "A", "item": { "sku": "333", "color": "black" }, "sizes": [ "S" ] }

Mongo 文档指定不同的命令如下:

查找单个字段中指定字段的不同值 收藏。不同的返回一个包含数组的文档 独特的价值观。

在部门字段和 SKU 字段上执行不同时,返回如下:

db.inventory.distinct( "dept" )

输出:

[ "A", "B" ]

db.inventory.distinct( "item.sku" )

输出:

[ "111", "222", "333" ]

这清楚地表明了不同的命令顺序,默认情况下取决于将文档插入集合中的顺序。

但是理想情况下,像大小这样的数组字段上的不同字段(

db.inventory.distinct( "sizes" )
)应该返回
["S", "M", "L"]
,但反过来又返回
[ "M", "S", "L" ]

此行为仅在 _id 字段上添加默认索引,没有其他字段索引。

任何对 mongo 独特实现的见解都是有帮助的。预先感谢。

PS:我的要求是集合A包含用户元数据(userId,password,createdDate),我在A(userId字段)上使用distinct并在另一个集合B中创建文档以保留与用户相关的数据(例如订单)的每日快照。 典型的 B 文档如下: { 日期:日期时间, userData: [{user0 的订单}, {user1 的订单} ... ] }

月底,我需要汇总user0的订单数据。 用户元数据可以不断添加新用户,所有用户几乎都有日常订单活动。所以 mongo 不同的默认顺序在这里很重要。

mongodb mongodb-query pymongo pymongo-3.x
2个回答
2
投票

无法保证返回的订单结果,因此您应该假设它是任意的。

如果您需要特定顺序的结果,只需在查询中添加

.sort()


0
投票

如果您想在应用distinct时保留之前的顺序,则需要采用

mongo.aggregate
的方法,并且需要在应用
$sort
之前和之后应用
$group

因此,例如,如果您想在集合中应用

updated_at
列的 distinct 时保持
name
列的排序标准按降序排列,您应该执行以下操作:

db.collection.aggregate([
  { $sort: { updated_at: -1 } }, // Sort documents by updated_at Descending
  {
    $group: {
      _id: "$name", // Group Documents by name
      updated_at: { $first: "$updated_at" } // Capture most recent updated_at
    }
  },
  { $sort: { updated_at: -1 } }, // Sort groups by updated_at descending (need to be sorted again because the $group removes the sort on its output)
  { $project: { name: "$_id", _id: 0 } } // Project the desired output
])
  • 输出示例
[
  { "name": "apocalypse1212" },
  { "name": "victorcorcos" },
  { "name": "Belly Buster" }
]
© www.soinside.com 2019 - 2024. All rights reserved.