Я обнаружил это
https://docs.mongodb.com/manual/reference/bson-type-comparison-order/#objects
в котором говорится:
Для сравнения объектов BSON в MongoDB используется следующий порядок:
- Рекурсивно сравнивать пары ключ-значение в порядке их появления
внутри объекта BSON.
- Сравнить ключевые имена полей.
- Если имена ключевых полей совпадают, сравните значения полей.
- Если значения полей равны, сравните следующую пару ключ / значение (возврат к шагу 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}}]