2017-02-08 2 views
1

Я пытаюсь найти способ сделать запрос, сортировку и фильтрацию на значения объекта (который снова является объектом) в документе mongo. Структура документа,Как выполнить запрос, сортировку и фильтрацию значений объекта в mongodb?

{ 
    _id: '', 
    uid: '12345', 
    objects:{ 
     dkey1: { 
      prop1: val1, 
      prop2: val2, 
      ... 
     }, 
     dkey2: { 
      prop1: val1, 
      prop2: val2, 
      ... 
     }, 
     dkey3: { 
      prop1: val1, 
      prop2: val2, 
      ... 
     }, 
     dkey4: { 
      prop1: val1, 
      prop2: val2, 
      ... 
     } 
     ... 
    } 
} 

objects свойство может содержать 1000s объектов с динамическими ключами. Thery - это уникальные ключи, основанные на хеше. Когда я получаю эти объекты, я не хочу возвращать все. Я хочу запрашивать, сортировать, ограничивать, как это можно сделать, если они из разных документов. Например, если я скажу, что prop1 = val1 сортировать по prop2 предел 10, запрос должен вернуть первые 10 под-объектов в objects, где их prop1 - val1, отсортированные по prop2.

Я думаю, что это не может быть сделано с нормальным find. Итак, я пытаюсь создать структуру агрегации. На первом этапе я буду соответствовать по uid. Следующий? Я смущен. Вместо объектов с динамическими клавишами, если это массив объектов, я могу сделать $unwind, и на последующих этапах я мог бы сделать фильтр по внутренним свойствам (prop1, prop2 ...), сортировка и применение предела и т. Д. Но проблема в том, что это не массив объектов. Если есть способ конвертировать значения объекта objects в массив объектов, было бы проще. Я искал путь, но я не мог найти решение.

Я знаю, что структура не очень хорошая, и изменение схемы поможет мне. Но я в ситуации, я не могу ее изменить сейчас. Есть ли способ конвертировать значения objects в массив объектов? Или существует другой способ достижения такого же результата с некоторыми другими этапами агрегации?

ответ

-1

Почему это не может быть сделано с нормальной находкой? Согласно операциям агрегации documents, «группировать значения из нескольких документов вместе», и если я правильно понял, это не то, что вы хотите сделать здесь.

Попробуйте это:

db.objects.find({prop1: 'val1'}).sort({prop2: 1}).limit(10) 

Это было проверено в Монго оболочка

  • объектов будет ваша коллекция
  • числа от сорта означает возрастающий порядок, -1 будет по убыванию
  • и номер на пределе предельного значения конечно

--- Edit ----

Если вы хотите получить доступ к свойствам документов внутри другого документа, используйте точечную нотацию.

Пример: db.objects.find({'nestedobj.prop1': 'val1'})

--- Edit 2 ---

Теперь я вижу, я неправильно понял ваш вопрос. Сори. Проблема здесь в том, что я не думаю, что есть оператор, который позволит вам получить доступ к любому встроенному документу (я действительно не знаю, я могу изучить его, но не сейчас).

Но, может быть, я могу помочь вам сказать вам, что если вы собираетесь использовать «агрегат», «$ match» будет фильтровать результаты, поэтому uid не будет на этом этапе конвейера. MongoDB 2.4 обеспечивает поддержку функций Javascript, выполняемых в базе данных, но цель структуры агрегации, как я уже говорил вам, заключается в том, чтобы сопоставить сокращение документов, поэтому это не лучший сценарий. Я был бы обеспокоен производительностью и способностью движка базы данных выполнить то, что вы хотите. Но я думаю, что это должно быть проверено, прежде чем отклонить эту идею.

Прошу прощения за непонимание вашего вопроса, и я надеюсь, что вы сможете решить свою проблему. Дайте мне знать, если вы это сделаете и как!