2016-04-11 9 views
0

Ich bin Neuling mit MongoDB habe ich ein Dokument mit dieser Struktur:Search Element in indiziertes Array

{ 
    "_id": "570a38612959856808fe9b1d", 
    "author": "foo", 
    "books": { 
     "570a385737000012009e6f65": { 
      "title": "a1", 
      "status": "published" 
     }, 
     "570a385737000012009e6f66": { 
      "title": "a2", 
      "status": "pending" 
     }, 
     "570a385737000012009e6f67": { 
      "title": "a1", 
      "status": "published" 
     } 
    } 
} 

wie kann ich für alle Autoren suchen, die Bücher sind anhängig? habe ich versucht, so etwas wie

{ "books":{$elemMatch:{"status": "pending" }}} 

bekam aber nichts

+3

Bei einem solchen Schema, in dem Sie Hash-Schlüssel haben es ziemlich schwierig sein würde, zu fragen, wenn Sie es ändern können, so dass die dynamischen Buch-IDs in einem Array eingebettet sind. – chridam

+0

Sie wollen eigentlich eine Struktur wie '" Bücher ": [{" _id ":" 570a385737000012009e6f65 "," title ":" a1 "," status ":" veröffentlicht "}, {..}]' Was dann für einfach Fragen wie '{" books.status ":" pending "}'. Punkt ist, dass benannte Schlüssel einen "expliziten" Pfad benötigen, aber ohne sie ist der Name des "Pfads" für alle Elemente gleich. –

Antwort

1

ich mit den Kommentaren überein, dass diese für Ihre Daten nicht die ideale Struktur ist, aber es ist möglich, dass alle Autoren abzufragen, die mit der anstehenden Bücher haben $where Betreiber. Der $where Operator nimmt eine Javascript-Funktion:

db.authors.find({"$where" : function() { 
    if (this.books) { 
     for (var i in this.books) { 
      if (this.books[i].status == 'pending') { 
       return true; 
      } 
     } 
    } 
    return false; 
}}); 

... oder Javascript Ausdruck (im Wesentlichen der Inhalt der Funktion als String):

db.authors.find({"$where" : "if (this.books) { for (var i in this.books) { if (this.books[i].status == 'pending') { return true; }}} return false;"}); 

Sie können weiterhin festlegen, welche zurückFelder,

usw.
db.authors.find({"$where" : function() { 
    ... 
}},{author:1}); 

Mehr Informationen über die $where Betreiber:

https://docs.mongodb.org/manual/reference/operator/query/where/

Verwandte Themen