如何检索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
identifier
是error
然后$let
expression式来投影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" ] } } } } } ])