2016-10-24 4 views
0

У меня возникают проблемы при запросе на один из моих документов внутри базы данных через Meteor.Mongo Document Increment Sequence пропускает числа

Используя эту строку кода, я пытаюсь получить следующий порядковый номер из БД. Но по какой-то причине он иногда пропускает числа случайным образом.

var col = MyCounters.findOne(type); 
MyCounters.update(col._id, {$inc: {seq: 1}}); 
return col.seq; 

Не получает никаких ошибок на стороне сервера. Кто-нибудь знает, в чем проблема?

Я на Метеоре 1.4+

====================

Update

Я также обновить другую коллекцию с новое значение, полученное из MyCounters коллекции, так что это будет что-то вроде этого:

var col = MyCounters.findOne(type); 
MyCounters.update(col._id, {$inc: {seq: 1}}); 
var barId = col.seq; 

// declare barObject + onInsertError 
barObject.barId = barId; 
// ... 
FooCollection.insert(barObject, onInsertError); 

И FooCollection заканчивается Пропустив порядковые номера до 5000 иногда.

+0

Является ли этот код работает в качестве помощника? Я предполагаю, что вы намерены вернуть значение последовательности * до * обновления? –

+0

Чтобы понять, почему этот код пропускает числа, вам нужно будет описать, как вы его используете (например, в цикле, в обработчике запросов и т. Д.). В частности, было бы интересно, если он будет вызываться одновременно, поскольку он не является атомарным и, следовательно, подвержен условиям гонки. –

+0

@FlorianWinter Код внутри метода Метеор, который вызывается перед вставкой в ​​другой, чтобы поместить значение в качестве одного из его атрибутов. Я думал, что это могло быть условие гонки, и добавило несколько журналов и отлаживало его, чтобы увидеть, есть ли какие-либо ошибки между вызовом последовательности и вставкой документа для пропущенных номеров, но они не были. – Rob

ответ

0

Если вы хотите increament в том пункте документе, вы можете использовать:

var col = MyCounters.findOne(type); 
var valueOne = 1; 
var nameItem = 'seq'; 
var inc = {}; 
inc[ nameItem ] = valueOne; 
MyCounters.update({ _id: col._id }, { '$inc': inc }) 

Но если вы хотите increament значения из всех Документа из Коллекции MyCounters (макс НомерСтарта + 1), вы можете использовать:

var count = MyCounters.findOne({}, {sort:{seq:-1}}).seq; 
count = count + 1; 
MyCounters.update({_id:col._id}, {$set:{seq:count}}) 

Я надеюсь, что это сработает для вас. Благодаря

см: https://stackoverflow.com/a/33968766/4287229

+0

Спасибо, Памунгкас, но это на самом деле не отвечает на мой вопрос, я думаю, что я уже делаю первый вариант, который вы упомянули. Проблема в том, что она иногда пропускает номер инкремента вместо 1, я вижу, что он увеличивается на 500 или более. – Rob

Смежные вопросы