2017-10-12 50 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); 

名單加陣列卡。 在實踐中它看起來像這樣:

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

好吧,這是一個電路板的一個例子,問題是我能拉只在作者是「作者」的牌:物件(「59df60fb6fad6224f4f9f22a」)所有的板?

回答

0

您可以在3.4中嘗試下面的聚合。

Concat所有匹配($filter)卡在每個板後面$unwind並推動收集所有卡在板之間。

擊穿:

$reduce到Concat的單個文檔中的所有卡的陣列。

$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運營商換到只有地圖卡名稱。

所以更換$filter$map + $filter

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

Np個。幾件事情 - 1.將'collection'更改爲您的集合名稱,如'db。 .aggregate(...)'; 2.在mongo shell中運行查詢。 3.將'db。 .aggregate'替換爲'Board.aggregate(..)'以在貓鼬中執行。 – Veeram

+0

嘿,結果我會得到什麼??,我沒有做這麼複雜的查詢,我只有卡名? –

+0

您將擁有整個卡片元素的卡片陣列。你只需要名字? – Veeram