35

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

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

4

4 に答える 4

68

_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/

于 2011-08-29T03:00:20.453 に答える
4

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

于 2011-08-28T22:06:08.763 に答える
3

質問が「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;

于 2012-11-12T19:58:46.693 に答える