2017-10-12 8 views
0

에서 일치하는 모든 중첩 된 배열을 얻을 :CONCAT 내가 모델이 데이터베이스에, 나는 질문이 전체 컬렉션

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); 

. 나는 저자가 "저자는"인 경우에만 카드를 뽑을 수

{ 
    "_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 
} 

이 하나 개의 보드의 예입니다 좋아이 질문은 다음과 같습니다 : ObjectId가 ("59df60fb6fad6224f4f9f22a") 모든 실제로 그것은 다음과 같습니다 무대?

답변

0

3.4에서 아래 집계를 시도 할 수 있습니다.

각 보드의 모든 일치하는 카드 ($filter)를 뒤 따르고 $unwind을 연결하고 보드에서 모든 카드를 수집하려면이 버튼을 누릅니다.

내역 :

$reduce가 하나의 문서에있는 모든 카드의 배열을 CONCAT합니다.

$filter$$this (cards 어레이) 인자와 $$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에서 연산자를 포장해야합니다.

그래서 $filter $filter + $map

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

순이익 교체합니다. 몇 가지 - 1.'collection .'을'db. .aggregate (...)'와 같은 콜렉션의 이름으로 변경하십시오. 2. mongo 쉘에서 쿼리를 실행하십시오. 3.'db. .aggregate'를'Board.aggregate (..) '로 대체하여 몽구스로 실행하십시오. – Veeram

+0

안녕하세요, 결과는 어떻게됩니까? 복잡한 쿼리를 작성하지 않았습니다. 카드 이름 만 사용할 수 있습니까? –

+0

전체 카드 요소가있는 카드 배열을 갖게됩니다. 이름이 필요한거야? – Veeram