31

Spring Data を使用した MongoDB について質問があります。私はこれらのドメインクラスを持っています:

@Document
public class Deal  {
    @Id
    private ObjectId _id;
    private Location location;
    private User user;
    private String description;
    private String title;
    private String price;
    private boolean approved;
    private Date expirationDate;
    private Date publishedDate;
}

@Document
public class Location {
    @Id
    private ObjectId _id;
    private Double latitude;
    private Double longitude;
    private String country;
    private String street;
    private String zip;
}

@Document
public class User {
    @Id
    private ObjectId _id;
    private String email;
    private String password;
    private String profile_image_url;
    private Collection<Deal> deals = new ArrayList<Deal>();
}

これらのドメインを使用すると、CRUD を正常に実行できます。問題は 1 つだけです。ユーザーを商談とともに保存すると、それらを MongoDB に保存するときに、商談と場所の _id が null に設定されます。MongoDB が埋め込みオブジェクトの一意の ID を生成できないのはなぜですか?

1 つの取引でユーザーを保存した後の結果:

{ "_id" : ObjectId( "4fed0591d17011868cf9c982" ),
  "_class" : "User",
  "email" : "milo@gmail.com",
  "password" : "mimi",
  "deals" : [ 
    { "_id" : null,
      "location" : { "_id" : null,
        "latitude" : 2.22,
        "longitude" : 3.23445,
        "country" : "Denmark",
        "street" : "Denmark road 77",
        "zip" : "2933" },
      "description" : "The new Nexus 7 Tablet. A 7 inch tablet from Google.",
      "title" : "Nexus 7",
      "price" : "1300",
      "approved" : false,
      "expirationDate" : Date( 1343512800000 ),
      "publishedDate" : Date( 1340933521374 ) } ] }

結果からわかるように、Deal と Location ID は NULL に設定されています。

4

5 に答える 5

51

MongoDB の CRUD 操作 ( insertupdatefindremove) はすべて、最上位のドキュメントに対して排他的に動作しますが、もちろん、埋め込みドキュメントのフィールドでフィルター処理することもできます。埋め込みドキュメントは、常に親ドキュメント内で返されます。

_idフィールドは親ドキュメントの必須フィールドであり、通常は必要ないか、埋め込みドキュメントには存在しません。一意の識別子が必要な場合は、それらを確実に作成でき_idます。コードまたはメンタル モデルにとって便利であれば、フィールドを使用してそれらを格納できます。より一般的には、それらが表すものにちなんだ名前が付けられます (例: "username"、"otherSystemKey" など)。_idMongoDB 自体もドライバーも、最上位ドキュメント以外のフィールドに自動的にデータを入力することはありません。

特に Java では、埋め込みドキュメントのフィールドの ObjectId 値を生成したい場合は、次の_idように実行できます。

someEmbeddedDoc._id = new ObjectId();
于 2012-06-29T14:44:34.920 に答える
7

_id は、ルート ドキュメントでのみ既定でサブドキュメントに設定されません。

挿入および更新時にサブドキュメントの _id を定義する必要があります。

于 2012-06-29T07:51:39.680 に答える
7

_idMongo は、埋め込みドキュメントに を作成したり必要としたりしません。必要に応じてフィールドを追加でき_idます-私はそれを行いました。

@Document
public class Location {
    @Id
    private ObjectId _id;

    public Location() {
        this._id = ObjectId.get();
    }
}

@Document
public class User {
    @Id
    private ObjectId _id;

    public User() {
        this._id = ObjectId.get();
    }
}

これは私にとってとてもうまくいきます。

于 2012-10-10T15:55:58.887 に答える