2012-06-29 26 views
16

Springデータを持つMongoDBに関する質問があります。私がすることができます成功したCRUDこれらのドメインでMongoDB組み込みオブジェクトにID(NULL値)がありません

@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>(); 
} 

: は、私はこれらのドメインクラスを持っています。問題は1つだけです。取引を持つユーザを保存するとき、dealとLocationは、MongoDBに保存する際に_idをnullに設定します。 MongoDBが埋め込みオブジェクトのユニークなIDを生成できないのはなぜですか?

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

{ "_id" : ObjectId("4fed0591d17011868cf9c982"), 
    "_class" : "User", 
    "email" : "[email protected]", 
    "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) } ] } 

あなたが結果からわかるように、対処し、場所IDがNULLに設定されています。

+0

IDは、サブ文書ではなくルート文書を識別します。とにかくMongoDBがトップレベルのドキュメントだけを取り出すことができるので、ネストされたドキュメントのidを自動生成する必要はありません。あなたは実際にネストしたIDを何のために必要としますか? –

+0

私は、ユーザーではなく取引のみを検索する必要があります。今私はユーザーから検索し、プログラム内でユーザーのすべての取引をループしています。 – Millad

+0

IDはあなたが検索できるものとは関係ありません。 '{'deals.price':{$ gt:1000}}'を検索するのはまったく問題ありません。それでも、このクエリは、 'Deal'を手作業で取り出す必要がある' User'オブジェクトを返します。これはMongoDBの制限であり、Springのデータには何も示唆されていません。 –

答えて

4

デフォルトでは、ルート文書でのみサブ文書に_idが設定されていません。

挿入と更新時にサブ文書の_idを定義する必要があります。

+0

彼は私のためにそれをしてはいけませんか?どうやってやるの?すべてのドキュメントを1つだけ挿入して、それらをまとめてもいいですか?これは私が挿入する方法です:mongoOperation.insert(deal); – Millad

+0

MongoDBはこれをやってくれませんが、もう一度、あなたのドライバーは...モーフィアを使っていますか? – Sammaye

+0

返信いただきありがとうございます。私はSpring Dataとmongo-java-driverを使用しています。私が取引を検索すると、私はUserオブジェクトを取得します。私は行く必要がある取引を使用して検索することはできません。 – Millad

29

MongoDBのCRUD操作(insertupdatefindremove)すべてが独占的にトップレベルの文書を操作する - もちろん、あなたが埋め込まれた文書内のフィールドでフィルタすることができますが。埋め込みドキュメントは常に親ドキュメント内に返されます。

フィールドは、親ドキュメントの必須フィールドです。通常、埋め込みドキュメントには必須ではありません。一意の識別子が必要な場合は、確実に識別子を作成できます。コードまたは心理モデルに便利な場合は、_idフィールドを使用して格納します。より一般的には、それらの表現に基づいて名前が付けられます(例:「username」、「otherSystemKey」など)。 MongoDB自体も、ドライバのいずれも、_idフィールドにはトップレベルのドキュメントを除いて自動的に設定されません。あなたが埋め込まれた文書に_idフィールド用のObjectId値を生成したい場合

は、具体的にJavaで、あなたがそうすることができます。

someEmbeddedDoc._id = new ObjectId(); 
+0

これをクリアしていただきありがとうございます。だから私が取引だけをリストにしたいのであれば、取引が個別の文書であり、ユーザーが分離した文書でありクエリであるように、取引文書からユーザー文書を分離または移動する必要があります。 – Millad

+0

既存のデータモデルで動作するようにコードを調整するか、調整します。取引を頻繁に操作している場合や、取引が複数のユーザーに関連付けられている場合、データモデルを正規化することは意味があります。 – dcrosta

2

Mongoの作成または埋め込まれた文書に_id秒を必要としません。あなたが望むなら、私はそれをやった_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(); 
    } 
} 

これは素晴らしい作品です。

4

RESTアーキテクチャのコンテキストでは、ネストされたドキュメントが独自のIDを持っているという意味があります。

  1. 持続性実装はリソース表現から独立している必要があります。 APIコンシューマとして、mongoまたはmysqlを使用しているかどうかは気にしません。 mongoでIDなしのドキュメントをネストすると、永続性レイヤーをリレーショナルデータベースに変更する方法を想像してみてください。今では、実装に依存しないアプローチで事前に考えていたのと同じ演習を行います。リレーショナルデータベース、ネストされたドキュメント内のネストされたドキュメントのモデリングは、それぞれ独自のIDを持つ異なるエンティティ/テーブルになります。ルートは、ネストされたドキュメントと1対多の関係を持つことができます。
  2. mongoで発行されているような絶対的なユニークなIDは必要ないかもしれませんが、ローカルの一意の識別子が必要です。これはルート文書内でユニークです。

ネストされたドキュメントでのIDの必要性に関する私の主張は、@dcrostaはすでにmongoの_idフィールドに値を設定する方法について正解を与えています。

これが役に立ちます。

関連する問題