2016-01-04 3 views
0

В настоящее время я использую следующий найти запрос, чтобы получить последнюю версию документа определенного IDколлекция Метеора получить последний документ каждого выбора

Conditions.find({ 
         caveId: caveId 
        }, 
        { 
         sort: {diveDate:-1}, 
         limit: 1, 
         fields: {caveId: 1, "visibility.visibility":1, diveDate: 1} 
        }); 

Как я могу использовать тот же, используя несколько идентификаторов с $, например, в

Я попробовал его со следующим запросом. Проблема в том, что он ограничит документы до 1 для всех найденных caveIds. Но он должен установить предел для каждого другого caveId.

Conditions.find({ 
         caveId: {$in: caveIds} 
        }, 
        { 
         sort: {diveDate:-1}, 
         limit: 1, 
         fields: {caveId: 1, "visibility.visibility":1, diveDate: 1} 
        }); 

Одно из решений, с которыми я столкнулся, использует совокупную функциональность.

var conditionIds = Conditions.aggregate(
     [ 
      {"$match": { caveId: {"$in": caveIds}}}, 
      { 
       $group: 
        { 
         _id: "$caveId", 
         conditionId: {$last: "$_id"}, 
         diveDate: { $last: "$diveDate" } 
        } 
       } 
     ] 
    ).map(function(child) { return child.conditionId}); 

    var conditions = Conditions.find({ 
         _id: {$in: conditionIds} 
        }, 
        { 
         fields: {caveId: 1, "visibility.visibility":1, diveDate: 1} 
        }); 
+0

Я думаю, вам нужно изучить https://docs.mongodb.org/manual/reference/method/db.collection.distinct/ –

ответ

0

Вы не хотите использовать $in здесь, как указано. Вы можете решить эту проблему, перейдя через caveIds и выполнив запрос для каждого caveId отдельно.

0

Вы в основном смотрите на запрос соединения: вам нужны все caveIds, а затем поиск для каждого из них.

Это проблема схемы базы данных/денормализацию на мой взгляд: (но это только мнение!):

Вы могли бы, как упомянуто здесь, LookUp все caveIds, а затем запустить один запрос для каждого, каждый один раз вам нужно искать последние погружения.

Однако я думаю, что вам намного лучше записывать/обновлять последнее погружение внутри вашего документа cave, а затем искать все интересующие вас пещеры, тянущие только поле lastDive.

Это даст вам сразу то, что вам нужно, вместо того, чтобы проходить дорогие поисковые/сортировочные запросы. Это за счет сохранения этого поля в документе, но похоже, что это должно быть довольно тривиально, так как вам нужно обновить одно поле при возникновении нового события.

+0

Привет. Я не думал об этом решении, фактически обновляя документ пещеры с датой lastDive. Это, вероятно, сделает его намного проще. Я столкнулся с решением, использующим агрегированные функции для сортировки и группировки, как вы упомянули. Он работает, но я не совсем уверен, насколько это дорого. Я добавил код к моему вопросу. – Chris

Смежные вопросы