MongoDbを使い始めたばかりですが、一意であることを意図したエントリの重複レコードがたくさんあることに気づきました。データに複合キーを使用する方法を知りたいのですが、それらの作成方法に関する情報を探しています。最後に、私はJavaを使用して、mongoとmorphiaにORMレイヤーとしてアクセスしているので、それらを回答に含めるのはすばらしいでしょう。
_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/
一意性をテストするドキュメントのフィールドに nique Indexes を作成できます。ドキュメンテーションからわかるように、それらは複合化することもできます(MongoDBランドでは複合キーインデックスと呼ばれます)。 Morphiaには、フィールドレベルでのインデックス作成をサポートする@Indexed
注釈があります。さらに、モーフィアでは、@Indexed
アノテーションを使用してクラスレベルで複合キーを定義できます。
質問が「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;
_です。