我的库存收集如下:
{ "_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 不同的默认顺序在这里很重要。
无法保证返回的订单结果,因此您应该假设它是任意的。
如果您需要特定顺序的结果,只需在查询中添加
.sort()
。
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" }
]