2017-08-17 16 views
1

でサブドキュメントを取得するために、どのように私は自分のデータベースに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", 
    ... 
] 

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"のアイテムです。 私はモンゴースとモンゴにちょっと新しいので、私はそれにこだわりました!!!そのデータクエリを適切にする手助けができますか?ありがとう。

答えて

0

これは動作するはずです:

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

に一致当たり全messagesmessages一つにアレイをマージします。私はメッセージの配列だけを取得したいと思います。 – bashkovpd

+0

@bashkovpd私は更新しました。投影と呼ばれています:https://docs.mongodb.com/manual/reference/operator/projection/positional/ – Lazyexpert

+0

うーん...私は何か間違っていますが、そのクエリは主な親要素の_idのみを返します( 'lang '指定された)。 – bashkovpd

0

あなたは3.4のmongoサーバのバージョンに集約下に試すことができます。

以下のクエリはidentifiermessage_subsets内のすべての一致するmessagesを投影する$let式が続くerrorすべてmessage_subsetsを収集するために$filterを使用します。

$reduce演算子($concatArrays)そうではなく、正確に文書

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" 
      ] 
      } 
     } 
     } 
    } 
    } 
])