私は MongoDb を使い始めたばかりで、一意にするつもりだったエントリのレコードが重複していることに気付きました。データに複合キーを使用する方法を知りたいのですが、それらの作成方法に関する情報を探しています。最後に、私は ORM レイヤーとして Java を使用して mongo と morphia にアクセスしているので、それらを回答に含めることは素晴らしいことです。
4 に答える
_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/
一意性をテストするドキュメントのフィールドに一意のインデックスを作成できます。ドキュメントからわかるように、それらは複合することもできます(MongoDBランドでは複合キーインデックスと呼ばれます)。Morphiaには@Indexed
、フィールド レベルでのインデックス作成をサポートするための注釈があります。morphia に加えて、@Indexed
アノテーションを使用してクラス レベルで複合キーを定義できます。
質問が「Java」としてマークされていることに気付いたので、次のようなことをしたいと思うでしょう:
final BasicDBObject id = new BasicDBObject("a", aVal)
.append("b", bVal)
.append("c", cVal);
results = coll.find(new BasicDBObject("_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;