#mongodb #mongodb-query #upsert
#mongodb #mongodb-запрос #upsert
Вопрос:
У меня есть требование обновить существующий документ, если время его обновления не старше 1 минуты с этого момента. У меня есть приведенный ниже запрос, но он все равно выполняется и обновляет существующий документ, несмотря ни на что. Как мне исправить это поведение?
threats.upsert({
threatType: threatLevel,
username: userOrDeviceName,
"misc.updatedTime": {$lt: new Date(new Date() - 60000)}
}, {
$set: {
'misc.updatedTime': new Date(),
'misc.updatedBy': 'system',
},
$addToSet: {
serverAddr: { $each: destinations }
},
$inc: {
flowCount: destinations.length
},
$setOnInsert: {
threatState: "open",
'misc.createdTime': new Date(),
'misc.createdBy': 'system',
}
}
Комментарии:
1. Мангуст, я полагаю? Если это так, то
threats
похоже, что это экземпляр , который вы извлекли черезfind()
илиfindOne()
. Если у вас есть экземпляр, то у вас есть данные под рукой, поэтому просто не обновляйте его . Для команд типаupdateOne()
илиfindOneAndUpdate()
вы бы просто добавили к предикату запроса, чтобы не выбирать документ, который не соответствует ограничению даты. Но поскольку у вас уже есть данные экземпляра , тогда вы проверяете свойство в коде и просто не выпускаете обновление .2. На самом деле я использую это как часть приложения meteor. Не используется mongoose.
3. В любом случае, та же базовая концепция. Отсутствие «предиката запроса» в функции говорит мне, что у вас уже есть экземпляр в памяти. В MongoDB нет функции, которая просматривала бы значение и решала, применять ли обновление в качестве «оператора обновления». Как я уже сказал, обычно мы исключаем документ с предикатом запроса. Однако вы уже извлекли данные с сервера. Поэтому просто протестируйте свойство, прежде чем решать, обновлять или нет. Просто.