2016-10-05 5 views
1

У меня есть коллекция, из которой я получаю max id и при вставке с использованием max id + 1. Столбец id уникален в этой коллекции.Параллельное чтение/запись в MongoDB

При вызове нескольких экземпляров этой службы одновременное приложение считывает одну и ту же коллекцию и получает максимальный идентификатор. Но поскольку один и тот же набор доступен, тот же самый максимальный id возвращается в несколько экземпляров, могу ли я получить явный блокировку коллекции при чтении данных из этой коллекции и освободить блокировку после записи в Mongo DB?

+0

Вы пытались использовать внешнюю синхронизацию или встроенные синхронизированные коллекции? –

+0

Не могли бы вы уточнить, есть ли у нас синхронизированные коллекции в MongoDB? –

+0

Не могли бы вы написать немного больше того, чего хотите достичь? Похоже, вам нужны транзакции, поэтому, возможно, MongoDB не самый лучший вариант здесь. Рассмотрим [auto incrementing sequence field] (https://docs.mongodb.com/v3.0/tutorial/create-an-auto-incrementing-field/#auto-increment-counters-collection) или [$ inc] (https : //docs.mongodb.com/manual/reference/operator/update/inc/), если вам просто нужен атомный способ увеличить счетчик. – mkorszun

ответ

1

Используя метод mongoDB collections.findAndModify(), вы можете создать свой собственный запрос «get-and-increment».

Например:

db.collection_name.findAndModify({ 
    query: { document_identifier: "doc_id_1" }, 
    update: { $inc: { max_id: 1 } }, 
    new: true //return the document AFTER it's updated 
}) 

https://docs.mongodb.com/manual/reference/method/db.collection.findAndModify/

Взгляните на эту страницу для получения дополнительной помощи:

https://www.tutorialspoint.com/mongodb/mongodb_autoincrement_sequence.htm

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/13890230) – rpax

+0

@rpax Спасибо за ввод, я отредактировал сообщение. – ToreDenStore

+0

это здорово! Ты получил мой. +1. – rpax

0

попробовать этот подход

Вместо того, чтобы получать max id в чтении коллекции и увеличивать ее как max id + 1.

В то время как чтение для нескольких экземпляров просто дать документ/сбор, и при обновлении следуйте приведенной ниже логике

Let us have the below part in a synchronized block, so that no two threads gets the same max id 
synchronize() { 
    getMaxId from collection 
    increase it by 1 
    insert the new document 
} 

Пожалуйста, обратитесь:

https://docs.mongodb.com/v3.0/tutorial/create-an-auto-incrementing-field/

https://www.tutorialspoint.com/mongodb/mongodb_autoincrement_sequence.htm

Надеется, что это помогает !

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