web-dev-qa-db-ja.com

MongoDB複合キー

MongoDbを使い始めたばかりですが、一意であることを意図したエントリの重複レコードがたくさんあることに気づきました。データに複合キーを使用する方法を知りたいのですが、それらの作成方法に関する情報を探しています。最後に、私はJavaを使用して、mongoとmorphiaにORMレイヤーとしてアクセスしているので、それらを回答に含めるのはすばらしいでしょう。

モルフィア: http://code.google.com/p/morphia/

30
Paul Gregoire

_idフィールドにもオブジェクトを使用できます。 _idフィールドは常に一意です。このようにして、複合主キーを取得します。

 { _id : { a : 1, b: 1} }

これらのIDを作成するときは、キーの順序(例ではaとb)が重要であることに注意してください。入れ替えると、別のオブジェクトと見なされます。

もう1つの可能性は、_idをそのままにして、 一意の複合インデックスを作成 にすることです。

db.things.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
//Deprecated since version 3.0.0, is now an alias for db.things.createIndex()

https://docs.mongodb.org/v3.0/reference/method/db.collection.ensureIndex/

60
Thilo

一意性をテストするドキュメントのフィールドに nique Indexes を作成できます。ドキュメンテーションからわかるように、それらは複合化することもできます(MongoDBランドでは複合キーインデックスと呼ばれます)。 Morphiaには、フィールドレベルでのインデックス作成をサポートする@Indexed注釈があります。さらに、モーフィアでは、@Indexedアノテーションを使用してクラスレベルで複合キーを定義できます。

4
lobster1234

質問が「Java」としてマークされていることに気づいたので、次のようなことをしたいでしょう:

_final BasicDBObject id = new BasicDBObject("a", aVal)
        .append("b", bVal)
        .append("c", cVal);
results = coll.find(new BasicDBObjet("_id", id));
_

私もMorphiaを使用していますが、(機能している間は)複合キーをマーシャリングしようとすると、多くのエラーが生成されることを発見しました。これらのエラーを回避するために、クエリを実行するときに上記を使用します。

私の元のコード(これも機能します):

_final ProbId key = new ProbId(srcText, srcLang, destLang);
final QueryImpl<Probabilities> query = ds.createQuery(Probabilities.class)
  .field("id").equal(key);
Probabilities probs = (Probabilities) query.get();
_

私のProbIdクラスには@Entity(noClassnameStored = true)と注釈が付けられており、Probabilitiesクラス内では、idフィールドは_@Id ProbId id;_です。

1
Nic Cottrell