#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 }
);
}