Найдите один и обновите его случайным документом?

#node.js #mongodb #mongoose

Вопрос:

Я хочу найти и обновить один случайный документ, соответствующий указанным критериям. Я посмотрел на $sample ключевое слово aggregate, но я не уверен, как объединить его с обычным findOneAndUpdate . Текущий код является:

            const opts = { session };
           const savingGoal = await Goal.findOneAndUpdate({'participants.userID': {$ne : socket.uid},  private : {$ne : true}, goalType : category, $expr: { /** Allows the use of aggregation expressions within the query language  */
                $lte: [
                  {
                    $size: "$participants"
                  },
                  12
                ]
              }}, 
              {$push: {participants: participant}}, 
              {new : true, session})
 

В идеале я хотел бы просто найти любой случайный документ и обновить его, добавив нового участника. Есть какие-нибудь предложения?

Ответ №1:

Я не думаю, что есть какой-либо прямой вариант для обновления случайного документа, но вы можете выполнить 2 запроса: первый запрос агрегации для выбора одного документа с помощью $sample этапа, а затем запрос на обновление.

 const opts = { session };
// AGGREGATION TO SELECT SINGLE RANDOM DOCUMENT
const savingGoal = await Goal.aggregate([
  {
    $match: {
      'participants.userID': { $ne : socket.uid },  
      private: { $ne : true }, 
      goalType: category, 
      $expr: {
        $lte: [{ $size: "$participants" }, 12]
      }
    }
  },
  { $sample: { size: 1 } }
]);

// UPDATE QUERY
if (savingGoal.length) {
  await Goal.updateOne(
    { _id: savingGoal[0]._id }, 
    { $push: { participants: participant } }, 
    { session } 
  ); 
}