Я довольно новичок в MongoDB, так что это может быть моей неопытностью. Я пытаюсь сделать upsert
, чтобы при обнаружении записи она обновляла несколько полей на основе нескольких условий.
У меня есть следующая запись в коллекции:
{
modelId: "5e68c7eaa0887971ea6ef54c",
versionId: 999,
timeStamp: "1/1/2020",
oldValue: 'Blue',
newValue: 'Red'
}
Я пытаюсь выполнить следующие условия с помощью одного оператора upsert
, чтобы избежать многократных поездок в БД (на основании запроса, что найден документ, соответствующий modelId
и versionId
:
- Если
timeStamp
новой записи предшествует (lt
) существующему документу, то обновляется oldValue
- Если
timeStamp
новой записи идет после (gt
) существующего документа затем обновите newValue
- Если соответствующие записи не найдены, вставьте новую запись.
В терминах кода psuedo я пытаюсь сделать это с помощью оператора upsert
:
existingRecord = item in collection matching modelId and versionId
if(existingRecord = null)
{
//insert newRecord
}
if(newRecord.timeStamp < existingRecord.timeStamp)
{
existingRecord.oldValue = newRecord.oldValue
existingRecord.timeStamp = newRecord.timeStamp
}
else if(newRecord.timeStamp > existingRecord.timeStamp)
{
existingRecord.newValue = newRecord.newValue
existingRecord.timeStamp = newRecord.timeStamp
}
Я видел возможность сделать upsert
на основе даты, что-то вроде:
db.collection.update( { id:o.id, date: { $lt:o.date } }, {$set : { o }}, {upsert:true} );
Я не знаю, как расширить это до иметь возможность обновлять oldValue
или newValue
на основе значения timeStamp
.
Я планирую добавлять в коллекцию большое количество записей каждый день, по оценкам около 1 мм, я бы не хотел делать find()
, а затем update()
для каждой записи.
Я использую Пн go 4.0 и буду признателен за любые советы.
Спасибо!