37

そのため、コレクション内のアイテムから特定のサブドキュメントを一意に参照する必要があります。例えば:

User = {
    'name': 'jim',
    'documents: [
        {'id': 0001, 'title': "My document"},
        {'id': 0002, 'title': "My second document!"},
    ]
}

したがって、できればアプリケーションレベルではなく、新しいドキュメントのIDを自動作成できるようにする必要があります(実際の開発シナリオでは競合状態が発生するため)。

mongoの自動生成されたObjectId(コレクションレベルの_idフィールドで使用される)または同様のものを使用する方法はありますか?

4

6 に答える 6

29

はい、mongoのObjectIdを使用するのが方法です。唯一のことは、アプリケーションコードで自分で生成する必要があるということです。これらはグローバルに一意であることが意図されており、異なるワーカーが2つの同一のObjectIdを生成しないため、その意味での競合状態はありません。

すべての公式ドライバーは、ObjectIdを生成する方法を提供する必要があります。Rubyでの動作は次のとおりです。

oid = BSON::ObjectId.new
于 2012-04-13T16:51:01.577 に答える
11

すべてのドライバーには、ObjectIdを生成するための機能があります。

シェルでは、次のことを行いますnew ObjectId()

> db.test.insert({x:new ObjectId()});
> db.test.find();
{ "_id" : ObjectId("4f88592a06c05e4de90d0bc1"), "x" : ObjectId("4f88592a06c05e4de90d0bc0") }

Javanew ObjectId()でも同様です。特定の構文を確認するには、ドライバーのAPIドキュメントを参照してください。

于 2012-04-13T16:51:31.603 に答える
8

mongoengineを使用して、のような埋め込みドキュメントにObjectIdを作成します。

from bson.objectid import ObjectId

class Address(EmbeddedDocument):
    _id = ObjectIdField( required=True, default=ObjectId )
    street = StringField()
于 2015-12-07T09:17:10.580 に答える
3

Meteorのサーバーでは、次を使用します。

new Meteor.Collection.ObjectID(hexString);

参照:http ://docs.meteor.com/#collection_object_id

于 2013-08-25T06:00:12.253 に答える
2

そしてこれはあなたがPython(pymongo)でそれを行う方法です:

from pymongo import MongoClient
import bson

client = MongoClient('mongodb://localhost:27017/')
db = client.test_db

result=db.users.insert_one({'name': 'jim',
    'documents': [
        {'_id': bson.objectid.ObjectId(), 'title': "My document"},
        {'_id': bson.objectid.ObjectId(), 'title': "My second document!"},
    ]})

print list(db.users.find({}))
于 2018-06-06T22:27:32.903 に答える
0

そして、congomongoの使用を想定して、Clojureでそれを行う方法は次のとおりです。

(import org.bson.types.ObjectId)
(str (ObjectId.)) ; => "12345xxxxx"
于 2014-07-22T12:00:23.840 に答える