$ max如何处理一组对象?

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

以这些文档为例进行示例收集:

client.test.foo.insert_one({
    'name': 'clientA',
    'locations': [
        {'name': 'a', 'sales': 0, 'leads': 2}, 
        {'name': 'b', 'sales': 5, 'leads': 1}, 
        {'name': 'c', 'sales': 3.3, 'leads': 1}]})
client.test.foo.insert_one({
    'name': 'clientB',
    'locations': [
        {'name': 'a', 'sales': 6, 'leads': 1},
        {'name': 'b', 'sales': 6, 'leads': 3},
        {'name': 'c', 'sales': 1.3, 'leads': 4}]})

$ max如何确定位置数组中的哪个项目是最大的?

client.test.foo.aggregate([{'$project': {'maxItem': {'$max': '$locations'}}}]))

返回:

[{'_id': ObjectId('5b995d72eabb0f0d86dceda5'),
  'maxItem': {'leads': 1, 'name': 'b', 'sales': 5}},
 {'_id': ObjectId('5b995d72eabb0f0d86dceda6'),
  'maxItem': {'leads': 3, 'name': 'b', 'sales': 6}}]

看起来$max正在挑选sales,但我不确定为什么?

mongodb aggregation-framework
1个回答
0
投票

我发现这个https://docs.mongodb.com/manual/reference/bson-type-comparison-order/#objects说:

MongoDB对BSON对象的比较使用以下顺序:

  1. 按照它们在BSON对象中出现的顺序递归地比较键值对。
  2. 比较关键字段名称。
  3. 如果键字段名称相等,则比较字段值。
  4. 如果字段值相等,则比较下一个键/值对(返回步骤1)。没有进一步对的对象小于具有更多对的对象。

这意味着如果sales是bson对象中的第一个键,那么我有我的答案。我正在使用pymongo和python词典没有订购,所以我切换到bson.son.SON并重新做了例子:

client.test.foo.delete_many({})
client.test.foo.insert_one({
    'name': 'clientA',
    'locations': [
        bson.son.SON([('name', 'a'), ('sales', 0), ('leads', 2)]), 
        bson.son.SON([('name', 'b'), ('sales', 5), ('leads', 1)]),
        bson.son.SON([('name', 'c'), ('sales', 3.3), ('leads', 1)])]})
client.test.foo.insert_one({
    'name': 'clientB',
    'locations': [
        bson.son.SON([('name', 'a'), ('sales', 6), ('leads', 1)]), 
        bson.son.SON([('name', 'b'), ('sales', 6), ('leads', 3)]),
        bson.son.SON([('name', 'c'), ('sales', 1.3), ('leads', 4)])]})

现在按名称排序:

client.test.foo.aggregate([{'$project': {'maxItem': {'$max': '$locations'}}}]))

返回:

[{'_id': ObjectId('5b99619beabb0f0d86dcedaf'),
  'maxItem': {'leads': 1, 'name': 'c', 'sales': 3.3}},
 {'_id': ObjectId('5b99619beabb0f0d86dcedb0'),
  'maxItem': {'leads': 4, 'name': 'c', 'sales': 1.3}}]
© www.soinside.com 2019 - 2024. All rights reserved.