如何检索Mongoose中的子文档

我的数据库中有mongo集合:

[ { "_id": "59955bb0cd522a00bcaab08c", "lang": "en", "__v": 0, "message_subsets": [ { "identifier": "errors", "_id": "59955bb0cd522a00bcaab08d", "messages": [ { "identifier": "invalid", "message_text": "$FIELD$ is invalid", "_id": "59955bb0cd522a00bcaab091" }, { "identifier": "empty", "message_text": "$FIELD$ is required", "_id": "59955bb0cd522a00bcaab090" } ] } ] }, { "_id": "59955bb0cd522a00bcaab08c", "lang": "ru", ... ] 

这是由这种mongoose模式构build的:

 const MessageSchema = new mongoose.Schema({ identifier: { type: String, unique: true, required: true, trim: true }, message_text: { type: String, required: true, trim: true } }); const MessageSubsetSchema = new mongoose.Schema({ identifier: { type: String, unique: true, required: true, trim: true }, messages: [MessageSchema] }); const LangMessageSetSchema = new mongoose.Schema({ lang: { type: String, unique: true, required: true, trim: true }, message_subsets: [MessageSubsetSchema] }); 

我想检索message_subsets数组项中的所有messages ,如果它们的父项有"lang": "en"那么它具有"identifier": "errors" "lang": "en" 。 因为我有点新mongoose和孟戈我卡住了! 你能帮我把这些数据以正确的方式查询吗? 谢谢。

这应该工作:

 Collection.find({'messages.message_subsets.identifier':'errors', 'lang': 'en'}, {'messages': 1}) 

您可以在3.4 mongo服务器版本中尝试下面的聚合。

下面的查询将使用$filter来收集所有的message_subsets identifiererror然后$letexpression式来投影message_subsets所有匹配的messages

$reduce操作符会将( $concatArrays )所有messages合并到每个匹配文档的一个messages数组中

 db.collection_name.aggregate( [ { "$match": { "lang": "en", "message_subsets.identifier":"errors" } }, { "$project": { "messages": { "$reduce": { "input": { "$let": { "vars": { "message_s": { "$filter": { "input": "$message_subsets", "as": "message_s", "cond": { "$eq": [ "$$message_s.identifier", "errors" ] } } } }, "in": "$$message_s.messages" } }, "initialValue": [], "in": { "$concatArrays": [ "$$value", "$$this" ] } } } } } ])