2013-03-28 8 views
7

Mam następujący schemat na:Jak pobrać dokument macierzysty na podstawie wartości poddokumentu w Mongoose?

var Child = new mongoose.Schema({ 
    'field': String, 
    'value': String 
    }); 

var Parent = new mongoose.Schema({ 
    'name': String, 
    'children': [ Child ] 
    }); 

Chcę zwrócić Parent dla których jednym z Child „s odpowiada następujący obiekt JSON:

{ 'field': 'Family Name', 'value': 'Smith' } 

próbowałem to:

Parent.findOne({ 'children': { 'field': 'Family Name', 'value': 'Smith' } }, fn ...) 

ale nadal pobiera dane null.

EDIT:

Testowanie poprzez rozszerzenie powłoki Mongo, dowiedziałem się, że sub-dokumenty Child mają własne _id „s. Jeśli dodaję tę wartość do zapytania _id, pobierze ona dokument parent. Teraz nie wiem z góry, kim będzie to dziecko id. A więc: jak mogę go usunąć z zapytania pod-dokumentu? (Innymi słowy, powyższe zapytanie dosłownie wygląda na obiekt JSON z zaledwie dwóch właściwości, podczas gdy podrzędne dokumenty mają trzy)

Moje środowisko jest: node.js, Mongoose, MongoDB

+1

Jeśli masz obiekt podrzędny, możesz wywołać 'child.parent()'. Jeśli nie, musisz odpowiedzieć na to pytanie. – tbeseda

+0

Nie mam obiektu 'child', stąd zapytanie. Ale samo zapytanie nie wydaje się pobierać żadnego "rodzica" ... –

Odpowiedz

3

Czy istnieje powód używasz pola, struktury wartości na dokumentach podrzędnych? Łatwiej byłoby po prostu użyć klawisza jako pola, np. {"FamilyName": "Smith"}. Pozwoliłoby to coś takiego:

Parent.findOne({'children.FamilyName': 'Smith}, function(err, doc){...}); 
+0

Rzeczywiście, ale mam model dynamiczny, dlatego nieco rozszerzoną strukturę. W międzyczasie znalazłem rozwiązanie; opublikuje go w drugim –

10

Wydaje się $elemMatch jest operatorem zapytania, aby rozwiązać ten problem. Rzeczywista kwerenda powinna być napisana w następujący sposób:

Parent.findOne({ 'children': { $elemMatch: { 'field': 'Family Name', 'value': 'Smith' } } }, fn ...) 
+0

Próbuję dowiedzieć się, jak zrobić $ elemMatch pracy na pod-pod-pod-dokumencie. czy próbowałeś czegoś takiego? – user323774

Powiązane problemy