2012-01-03 15 views
0

私はこのケースを見て、DBRefといくつかのトラブルを抱えています:のMongoDB - DBRef

> db.basket.find() 
{ "_id" : "1", "items" : [ 
    { 
     "$ref" : "fruit", 
     "$id" : "1" 
    }, 
    { 
     "$ref" : "fruit", 
     "$id" : "3" 
    } 
] } 

消えた "数量" 属性:

db.fruit.save ({"_id" : "1" , "name" : "apple"}); 
db.fruit.save ({"_id" : "2" , "name" : "grape"}); 
db.fruit.save ({"_id" : "3" , "name" : "orange"}); 
db.fruit.save ({"_id" : "4" , "name" : "pineapple"}); 

db.basket.save ({"_id" : "1", "items" : [ 
    {"$ref" : "fruit", "$id" : "1", "quantity" : 5}, 
    {"$ref" : "fruit", "$id" : "3", "quantity" : 10} 
]}) 

は今、 "バスケット" コレクションを見つけることができます!なぜ誰が知っていますか?代わりがありますか?

ありがとうございました。 dbrefため

答えて

8

構文は

{ $ref : <collname>, $id : <idvalue>[, $db : <dbname>] } 

あるしかし、あなたはdbref内の非サポート数量フィールドを追加しました。それは問題です。ルックスのどの種類(怖い)

{ 
    "_id" : "1", 
    "items" : [ 
     { 
      "quantity" : 5, 
      "item" : { 
       "$ref" : "fruit", 
       "$id" : "1" 
      } 
     }, 
     { 
      "quantity" : 10, 
      "item" : { 
       "$ref" : "fruit", 
       "$id" : "3" 
      } 
     } 
    ] 
} 

db.basket.save ({"_id" : "1", "items" : [ 
    {"quantity" : 5 , item : {"$ref" : "fruit", "$id" : "1"}}, 
    {"quantity" : 10, item : {"$ref" : "fruit", "$id" : "3"}} 
]}) 

外しかし、私のアドバイスは、これがこの

db.basket.save ({"_id" : "1",items:[ 
         {item_id:"1",quantity:50}, 
         {item_id:"3",quantity:10} 
       ]}) 

のようなシンプルな構造を使用して完全に、ちょうどdbrefを捨てて、あることを取りますはるかにきれいに見える、

{ 
    "_id" : "1", 
    "items" : [ 
     { 
      "item_id" : "1", 
      "quantity" : 50 
     }, 
     { 
      "item_id" : "3", 
      "quantity" : 10 
     } 
    ] 
} 
+1

最後のアプローチでは、どのようにして結合のようにすべてのアイテムデータを取得できますか? – jtomasrl

+1

MongoDbには参加しません –

+1

実際には単なるBSONオブジェクトなので、明確にするために、DBRef内で追加のフィールドがサポートされています。しかし、MongoDBシェルは、値のレンダリング時に '$ ref'、' $ id'、およびオプションの '$ db'フィールド以外のフィールドを隠します。いくつかのODMは実際にDBRefオブジェクトに追加の値を格納します(Doctrineはクラス識別器の値でこれを行います)。つまり、同じデータベースとコレクション内のオブジェクトを常に参照している場合は、 '$ ref'と' $ db'はそのような場合には役に立たないオーバーヘッドであるため、DBRefなしではより良い結果が得られます。 – jmikola

関連する問題