2017-10-12 11 views
0

間で一致するすべてのネストされた配列を取得します:、連結方式と私はモデルを持っているデータベースで、私は疑問を持っているコレクション全体

board.model.jsは、アレイカードを追加するリスト内

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var BoardSchema = new Schema({ 
    name: { type: String, maxlength: 20 }, 
    lists : { type: Array }, 
    users : [{ type : Schema.Types.ObjectId, ref: 'User' }],  
}); 

module.exports = mongoose.model('Board', BoardSchema); 

。 実際には、それは次のようになります。すべてのObjectIdが(「59df60fb6fad6224f4f9f22a」):

{ 
    "_id" : ObjectId("59df60fb6fad6224f4f9f22a"), 
    "name" : "1", 
    "users" : [ 
     ObjectId("59cd114cea98d9326ca1c421") 
    ], 
    "lists" : [ 
     { 
      "list" : "1", 
      "cards" : [ 
       { 
        "name" : "1", 
        "Author" : [ 
        ObjectId("59df60fb6fad6224f4f9f22a") 
        ], 
       }, 
       { 
        "name" : "2" 
       }, 
       { 
        "name" : "3" 
       } 
      ] 
     }, 
     { 
      "list" : "2", 
      "cards" : [ 
       { 
        "name" : "1", 
        "Author" : [ 
        ObjectId("59df60fb6fad6224f4f9f22a") 
        ], 
       }, 
       { 
        "name" : "2", 
        "Author" : [ 
        ObjectId("59df60fb6fad6224f4f9f22a") 
        ], 
       }, 
       { 
        "name" : "3" 
       } 
      ] 
     } 
    ], 
    "__v" : 0 
} 

オーケー、これは1枚の基板の一例で、質問は私が著者は、「著者」であるだけカードを引くことができていますボード?

答えて

0

3.4で以下の集計を試すことができます。

各ボードに一致するすべてのカード($filter)を続けて$unwindとし、ボード上のすべてのカードを収集するために押します。

内訳

$reduce単一の文書内のすべてのカードの配列を連結します。

$filter

$$thiscards配列)引数と$$valueは以前の値を維持しながら、カードを一致させるためのフィルタで動作します。

$concatArrays現在のフィルタリングされた値で前の値をマージします。

$unwindカード配列を解体するには$group$pushにして、すべてのカード配列をボードに渡す。カードの名前だけを取得するために、コメントに尋ねたよう

db.collection.aggregate([ 
    { 
    "$project": { 
     "boardcards": { 
     "$reduce": { 
      "input": "$lists.cards", 
      "initialValue": [], 
      "in": { 
      "$concatArrays": [ 
       "$$value", 
       { 
       "$filter": { 
        "input": "$$this", 
        "as": "result", 
        "cond": { 
        "$eq": [ 
         "$$result.Author", 
         ObjectId("59df60fb6fad6224f4f9f22a") 
        ] 
        } 
       } 
       } 
      ] 
      } 
     } 
     } 
    } 
    }, 
    { 
    "$unwind": "$boardcards" 
    }, 
    { 
    "$group": { 
     "_id": null, 
     "allboardcards": { 
     "$push": "$boardcards" 
     } 
    } 
    } 
]) 

は、あなただけのマップカード名に$filter$mapでオペレータをラップする必要があります。

ので$map + $filter

{ 
    "$map": { 
    "input": { 
     "$filter": { 
     "input": "$$this", 
     "as": "result", 
     "cond": { 
      "$eq": [ 
      "$$result.Author", 
      ObjectId("59df60fb6fad6224f4f9f22a") 
      ] 
     } 
     } 
    }, 
    "as": "result", 
    "in": { 
     "name": "$$result.name" 
    } 
    } 
} 
+0

NPで$filterを交換してください。いくつかのこと - 1. 'collection'を' db。 .aggregate(...) 'のようなコレクションの名前に変更します。 2. mongoシェルでクエリを実行します。 3. 'db。 .aggregate'を' Board.aggregate(..) 'に置き換えて、マングースで実行します。 – Veeram

+0

ちょっとした結果が得られましたか?そのような複雑なクエリを作成していませんでした。カード名しかありませんか? –

+0

あなたはカード全体の要素を持つカード配列を持っています。名前だけが必要ですか? – Veeram

関連する問題