2017-02-03 3 views
0

Ich habe diese Sammlung:MongoDB Abfrage auch für Kindelemente

[ 
{ 
    username : "User1", 
    theme : [ 
     { 
      name : "Theme1", 
      posts : [ 
       { 
        text : "test1", 
        postdate : 1, 
        comments : [ 
         {username: "User1"} 
        ] 
       }, 
       { 
        text : "test2", 
        postdate : 2, 
        comments : [ 
         {username: "User2"} 
        ] 
       }, 
       { 
        text : "test3", 
        postdate : 3, 
        comments : [ 
         {username: "User3"} 
        ] 
       } 
      ] 
     } 
    ], 
}, 

]

Und ich möchte, um zu überprüfen, ob es einen Kommentar von „User1“ für den Posten mit dem Text „test1“ ist. Ich habe dies bisher versucht, aber es funktioniert nicht:

db.user.find({ "theme.posts.text" : "test1" , "theme.posts.comments.username" : "User1"}); 

EDIT:

Das Problem ist, wenn ich für „test1“ Ich suche ein Ergebnis bekommen und als ich für „test2“ suchen Ich bekomme auch ein Ergebnis. Ich will aber nur ein Ergebnis, wenn der Beitrag mit dem Text "test1" einen Kommentar von "User1" hat. Also ich möchte überprüfen, ob ein Beitrag mit Text X einen Kommentar von Person Y hat.

Was ist die richtige Lösung?

Vielen Dank!

+0

Können Sie sagen, welcher Teil nicht funktioniert? Gibt es eine erwartete Ausgabe, nach der Sie suchen? – Veeram

+0

@Veeram Ja! Ich habe es bearbeitet. – user6586661

Antwort

1

Das Problem ist, dass Kommentare ein Array ist. Theme.posts.comments hat also keine Eigenschaft namens username. Stattdessen hat theme.posts.comments [0] eine Eigenschaft namens username.

Eine Lösung wäre, alle Ergebnisse mit Text zu erhalten: "test1" und dann verwenden Sie die JavaScript-Funktion indexOf auf dem Array result.comments und sehen, ob das Objekt {userName: 'User1'} im Array existiert.

Es würde wie folgt aussehen:

db.user.findOne({ "theme.posts.text" : "test1"},function(err,result){ 
     if(result.comments.indexOf({userName:'user1'}) !==-1){ 
       console.log("this post has a comment by user1"); 
} 
     else{ 
     console.log("this post does not have a comment by user1"); 
} 


}); 
+0

Okay, danke! Und was ist der beste Weg, um einfach den Kommentar [] des Posts mit "test1" zu bekommen? Weil ich nicht in jedes Array in Java schauen möchte. – user6586661

+0

Ich bearbeitet, um einzuschließen, wie der Code aussehen würde. –

+0

Das Problem ist, wenn ich findOne benutze bekomme ich auch das ganze Dokument. Das heißt, ich bekomme alle meine Beiträge mit allen Kommentaren. Gibt es nicht eine Möglichkeit, nur die Kommentare für diesen bestimmten Beitrag zu bekommen? – user6586661