2012-01-03 2 views
0

У меня возникли некоторые проблемы с DBRef, посмотрите этот случай:MongoDB - DBRef

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} 
]}) 

Теперь, позволяет найти "корзину" коллекцию:

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

"количество" атрибут исчезал?! Кто-нибудь знает почему? Есть ли альтернатива?

Спасибо.

ответ

8

Синтаксис для dbref является

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

Но вы добавили неподдерживаемое поле количества внутри dbref. Это проблема. считать, что за пределами

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

, какой вид выглядит (страшно)

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

Но мой совет, канавы dbref вообще и просто использовать простую структуру, как этот

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

это гораздо более чистым, который будет выглядеть как

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

, но с последним подходом, как я могу получить все данные элементов, например, присоединиться? – jtomasrl

+1

В MongoDb нет соединения –

+1

Просто для пояснения, дополнительные поля поддерживаются внутри DBRef, так как это действительно просто объект BSON; однако оболочка MongoDB скрывает поля, отличные от '$ ref',' $ id', и необязательное поле '$ db' при рендеринге значения. Некоторые ODM фактически хранят дополнительные значения в объекте DBRef (Doctrine делает это с помощью значений дискриминатора класса). Тем не менее, вам, безусловно, лучше без DBRef, если вы всегда ссылаетесь на объекты в одной базе данных и коллекции, так как '$ ref' и' $ db' являются бесполезными накладными расходами в этом случае. – jmikola