сортировка по ряду ассоциативных контейнеров, сериализованных в массивы Монго - PullRequest
0 голосов
/ 07 февраля 2012

У меня есть ассоциативный контейнер (с семантикой карты c ++), сериализованный в массив mongo db.В моей коллекции я получаю массивы, которые содержат мой ключ следующим образом.

db.qrs.find( { "u.i" : 111892 })

Я бы хотел отсортировать по элементу "value" моей "карты".Например:

db.qrs.find( { "u.i" : 731612 }).sort( { "u.c" : -1} )

Однако это просто сортирует массив в документе, а не сортирует по строке в наборе результатов.Пример отсортированной строки:

 { "_id" : ObjectId("4f2f9acea2b3adfce39ae395"), "i" : 11, "r" : 1, 
"s" : ")n(kQ!$A=@%RPv-SB0dQXh7ME*%lw=!$@(VshFU1H6#b7r*wb()t3Ps!^xQ1rNr7j", "u" : 
[   {   "c" : 7,    "i" : 29518,    "p" : 0 },  { "c" : 1,  "i" : 
924577,     "p" : 3 },  {   "c" : 1,    "i" : 731612,   "p" : 1 } ] }

У меня была некоторая надежда, что оператор позиции может работать, увы, он не выполняет то, что ожидал, мой запрос был сформулирован как:

db.qrs.find( { "u.i" : 111892 }).sort( { "u.$.c" : -1} )

Итак, как выглядит мой желаемый запрос?

Могу ли я каким-то образом транспонировать набор результатов, чтобы поднять пару ключ-значение, соответствующую моему предикату, чтобы стать частью структуры документа верхнего уровня набора результатов?

1 Ответ

1 голос
/ 07 февраля 2012

MongoDB никогда не сортирует сам массив. Вы видите массив в том виде, в котором он существует в документе.

Ваш конкретный вариант использования не поддерживается MongoDB в настоящее время. Вы не можете сопоставить определенный элемент в запросе, а затем выполнить сортировку только по этому элементу.

Это можно исправить, только избегая использования массива, например, используя значение для «i» в качестве ключа встроенного элемента:

{ "_id" : ObjectId("4f2f9acea2b3adfce39ae395"), "i" : 11, "r" : 1, 
"s" : ")n(kQ!$A=@%RPv-SB0dQXh7ME*%lw=!$@(VshFU1H6#b7r*wb()t3Ps!^xQ1rNr7j", "u" : 
{29518:   {   "c" : 7, "p" : 0 },  924577: { "c" : 1,"p" : 3 },  731612: {   "c" : 1,   "p" : 1 } }}

Затем вы можете отсортировать

db.qrs.find({"u.29518":{$exists:true}}).sort({"u.29518.c"-1})

Очевидно, что это решение может быть недоступно для вас, но я не вижу других маршрутов, которые бы не включали размещение элементов массива в выделенную коллекцию (на мой взгляд, это лучшее решение для схемы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...