Параллелизм - получение сгенерированного MongoDB идентификатора объекта, вставленного через Java безопасным для потока способом - PullRequest
7 голосов
/ 22 октября 2011

Каков наилучший способ получить сгенерированный в Mongo ID документа, вставленного через Java.

Процесс вставки документов в Java является многопоточным, а это означает, что нам нужен атомарный способ вставки и возврата идентификатора объекта.

Кроме того, если мы установим уникальный индекс, в случае, если объект является дубликатом, будет ли возвращен идентификатор?

Спасибо!

Ответы [ 3 ]

13 голосов
/ 23 октября 2011

Создайте ObjectId раньше, используйте его во вставке, и вам не нужно будет возвращать его базе данных.ObjectId не использует общий порядковый номер, чтобы быть уникальным, поэтому не имеет значения, если вы сгенерируете его перед вставкой или получите его после.

public ObjectId createThing() {
    ObjectId result = new ObjectId();
    BasicDBObject thingToInsert = new BasicDbObject();
    thingToInsert.put('_id', result);
    //set other fields here
    collection.insert(thingToInsert);
    return result;
}
1 голос
/ 30 октября 2012

Я получаю документ с помощью _id, но когда я получаю данные в свой класс java, например, mobile, атрибут _id, имеющий тип ObjectID me, я меняю его, устанавливая значение документа в mongodb.

1 голос
/ 22 октября 2011

нативные ObjectId, сгенерированные Mongo, уникальны во всем мире и могут безопасно использоваться из многопоточного приложения.

сгенерированный ObjectId можно получить из DbObject под ключом _id.

Если вставленный документ нарушает ограничение уникального индекса - драйвер java может вызвать исключение, в зависимости от значения WriteConcern:

 http://api.mongodb.org/java/current/com/mongodb/WriteConcern.html

Если его значение выше, то будет выдано исключение NORMAL - исключение.

WriteConcern может быть указан для каждого отдельного метода вставки (или обновления) или глобально с использованием DBCollection.setWriteConcern

...