2012-01-24 14 views
5

na tym stanowisku MongoDB finding nested elements, autor twierdzi, że struktura dokumentu MongoDB jest

 car : { "$ref" : "cars" , "$id" : { "$oid" : "4e8478ace4b0dea06288ad63"}} 

Kiedy próbowałem odtworzyć problem, ja spotkałem jakieś dziwne zachowania z wstawką MongoDB

Po uruchomieniu załącza się powyżej przykładowych danych, mam następujący błąd

> db.sample.insert({car:{ "$ref" : "cars" , "$id" : { "$oid" : "4e8478ace4b0dea06288ad63"}}}) 
Tue Jan 24 14:09:07 uncaught exception: field names cannot start with $ [$oid] 

mówi, że nazwy pól nie mogą zaczynać się $.

Jeśli ów przypadku, nie powinien działać, jeśli mogę usunąć $ z oid i lewo pozostała $ref & $id nietknięty

> db.sample.insert({car:{ "$ref" : "cars" , "$id" : { "oid" : "4e8478ace4b0dea06288ad63"}}}) 
    > db.sample.find() 
{ "_id" : ObjectId("4f1e6fbc403aae757ec6dea5"), "car" : { "$ref" : "cars", "$id" : { "oid" : "4e8478ace4b0dea06288ad63" } } } 

zaskakująco to działało. Teraz przyjmuje pola zacząć $

Również gdy próbowałem to zapytanie

> db.sample.insert({ "$ref" : "cars" }) 
document to insert can't have $ fields 

mam błąd z powrotem.

Nie rozumiem, co to powoduje? Czy ktoś ma jasny pomysł?

Odpowiedz

4

$id i $ref to specjalne identyfikatory używane do dbrefs. W przeciwnym razie nazwy pól rozpoczynające się od $ są niedozwolone.

Jednak dokumentem pierwszego poziomu nie może być sam plik dbref, dlatego błąd "wstawiany dokument nie może zawierać pól $".

Jednak dbref są dozwolone jako poddokumenty, np. (Od official docs)

"name" : "Joe", 
"classes" : [ 
     { 
       "$ref" : "courses", 
       "$id" : ObjectId("4b0552b0f0da7d1eb6f126a1") 
     } 
] 

Teraz $oid nie jest specjalnym identyfikatorem, a nie jest dozwolone, ponieważ $ ma szczególne semantyki: Pomyśl $inc. To jest operator, ale jeśli dozwolone są nazwy pól, może to być również nazwa pola.

Trzeba być ostrożnym przy stosowaniu positional operator in updates:

Operator położenia nie mogą być łączone z upsert ponieważ wymaga element dopasowania tablicy. Jeśli twoja aktualizacja zakończy się wstawieniem, to jako "nazwa pola" zostanie użyta "$".

+1

Tak, to jest powód ..dziękuję – RameshVel

+0

czy istnieje sposób, aby przypadkiem DBRefs? – Backlit

+0

@Backlit: Przykro mi, że nie rozumiem tego pytania. Chcesz zmienić składnię plików dbrefs? Upewnij się, że rozumiesz, że nie musisz używać dbrefs - w rzeczywistości zazwyczaj nie jest to wymagane, a oficjalne dokumenty zalecają stosowanie prostych bezpośrednich linków, takich jak 'UserId: 423434'. – mnemosyn

1

$ref$id i $db to jedyne prawidłowe klucze, które rozpoczynają się od znaku dolara - są one związane z konwencją DBRef.

Powodem nie można używać własne klucze zaczynające się od znaku dolara jest becuase ma Specialmeaning i byłoby inaczej utworzyć niejasności.

+0

Czy tak jest w pobliżu? Na przykład, uciekając od nich? – devo