В Angular 5
вы можете просто сказать
this.http.get<Example>('assets/example.json')
Это даст вам Observable<Example>
Ускорение, которое приводит к вставке документа, не является полностью атомной операцией. Подумайте о том, что upsert выполняет следующие дискретные шаги:
Таким образом, шаги 2 и 3 являются атомарными, но другое upsert может произойти после шага 1, поэтому вашему коду нужно проверить наличие дублированной ключевой ошибки, а затем повторить попытку, если это произойдет. В этот момент вы знаете документ с тем, что _id
существует, поэтому он всегда будет успешным.
Например:
var minute = utils.minute();
Monitor.update({ _id: minute }, { $inc: update }, { upsert: true }, function(err) {
if (err) {
if (err.code === 11000) {
// Another upsert occurred during the upsert, try again. You could omit the
// upsert option here if you don't ever delete docs while this is running.
Monitor.update({ _id: minute }, { $inc: update }, { upsert: true },
function(err) {
if (err) {
console.trace(err);
}
});
}
else {
console.trace(err);
}
}
});
См. здесь для связанных с документацией.
Вы все еще можете задаться вопросом, почему это может произойти, если вставка является атомарной, но это означает, что обновления не будут вставлены в вставленном документе до тех пор, пока они не будут полностью записаны, а не что никакая другая вставка из документа с тем же _id
.
Кроме того, вам не нужно вручную создавать индекс на _id
, поскольку все коллекции MongoDB имеют уникальный индекс на _id
независимо. Таким образом, вы можете удалить эту строку:
monitorSchema.index({_id: -1}); // Not needed
Автоматически уникальный индекс будет создан из поля _id
.
Управляете ли вы _id
с помощью custom value
или mongodb, управляя ObjectId
в поле _id.
Вы пытаетесь ввести запись с помощью _id: 24392490, которая уже существует. Таким образом, хотя вы использовали upsert, это не позволит, потому что _id - уникальный индекс.
exports.minute = function () {
return Math.round(Date.now() / 60000);
};
Как и в вашей реализации для генерации _id, это позволит вставить только 1 запись за 1 - 1,5 минуты ( Точно одна минута, если круг не используется).
update
upsert. Вот почему вы не можете избежать возможности попадания в дубликат ключевой ошибки, поэтому вам нужно проверить наличие ошибки и восстановить ее в своем коде. – JohnnyHK 30 May 2016 в 13:25