2017-01-26 11 views
1

Wir haben ein Mongodb-Dokument wie unten angegeben, und wir konfigurierten Textindex auf MessageTopic, MessageTopicQuestion und Antwortfelder, wenn ich mit einer Textzeichenfolge Suche dann erwarte ich nur übereinstimmende eingebettete Datensätze in den Ergebnissen nicht die gesamte Dokument.Suche in mongodb eingebettete Datensätze

Zum Beispiel im unteren Dokument, wenn ich mit dem Wort "private" suche, dann Ergebnisse sollten nur das erste eingebettete Dokument nicht beide die Datensätze zurückgeben. Wie Sie nur übereinstimmende eingebettete Dokumente abrufen und nicht übereinstimmende Dokumente ausschließen.

{ 
    "_id": ObjectId("586e8efdde81e56032000084"), 
"messageTopic": "My Private", 
"messageText": [{ 
    "messageTopicQuestion": "agent private", 
    "answer": "agent private", 
    "_id": ObjectId("586e8efdde81e56032000085"), 
    "keywords": ["private"] 
}, { 
    "messageTopicQuestion": "Greetings Checking", 
    "answer": "Heloo I am good What about u", 
    "_id": ObjectId("586fc80ccced739407000f4e"), 
    "keywords": ["Hi-Good", "Heloo"] 
}], 
"__v": 3 

}

ich unten Skript bin mit

 db.getCollection('messagetemplates').aggregate([{ 
      $match: { 

       $text: {$search: 'private'}, 
       visible: 'PUB' 
      } 
     },{ $sort: { score: { $meta: "textScore" } } }]) 

Hilfe schätzen. Vielen Dank.

Antwort

1

Ich glaube, die Frage ist eine Variation dieses Problems How to get a specific embedded document inside a MongoDB collection? Das Problem ist, wie Sie das einzelne eingebettete Dokument erhalten und den Rest ausschließen. Mein Vorschlag ist db.collection.find() anstelle von Aggregation zu verwenden. Etwas in diesem Sinne

 db.collection.find({ 'messageText.keyword': 'private' }, {'messageText.$': 1}); 

, wie oben durch die Antwort angezeigt.

messageText.keyword kann mit dem Feld ersetzt werden, in dem Sie gesucht werden möchten.

Ich kann bestätigen, dass das Szenario auf meiner Datenbank funktioniert.

Verwandte Themen