2017-07-26 15 views
2

我收到以下结果。下面可以制作一张地图,将每个阵列与其目标连接起来。加入相关属性的两个阵列

{ 
    "_id": ObjectId("597233b50e717e0585dbd94a"), 
    "createdAt": ISODate("2017-07-21T17:02:45.119+0000"), 
    "name": "cardoso", 
    "gender": "female", 
    "profile": [{ 
      "profession": "master", 
      "_id": ObjectId("597233b50e717e0585dbd94b"), 
      "departament": ObjectId("597233b50e717e0585dbd94e") 
     }, 
     { 
      "_id": ObjectId("59766719003e7d552fe40e8c"), 
      "profession": "master", 
      "departament": ObjectId("59766719003e7d552fe40e8b") 
     }, 
     { 
      "_id": ObjectId("5976b8f99d8a4326c6bf1ae5"), 
      "profession": "master", 
      "departament": ObjectId("5974d8fe398e5b2fd433410f") 
     } 
    ], 
    "Institution": { 
     "_id": ObjectId("597233b50e717e0585dbd94c"), 
     "cnpj": 64837134000144.0, 
     "deletedAt": false, 
     "departament": [{ 
       "title": "cardoso", 
       "category": "Sub-17", 
       "_id": ObjectId("597233b50e717e0585dbd94e") 
      }, 
      { 
       "sport": "Tênis", 
       "title": "novo", 
       "category": "Sub-12", 
       "_id": ObjectId("59766719003e7d552fe40e8b") 
      }, 
      { 
       "_id": ObjectId("5974d8fe398e5b2fd433410f"), 
       "category": "Intercâmbio", 
       "title": "testeJJJ", 
       "sport": "natação" 
      } 
     ] 
    } 
} 

我需要做以下结果。我不想在节点中操作结果。

{ 
    "sport": "Tênis", 
    "profession": "master", 
    "title": "novo", 
    "category": "Sub-12", 
    "_id": ObjectId("59766719003e7d552fe40e8b") 
} 

我已经趋于但查询最终得到非常大的做一些事情

回答

1

这里的基本前提是“查找”通过$map.

这是其他阵列,同时处理内容无论是通过$indexOfArray用MongoDB的3.4完成:

db.collection.aggregate([ 
    { "$addFields": { 
    "Institution": { 
     "departament": { 
     "$map": { 
      "input": "$Institution.departament", 
      "as": "d", 
      "in": { 
      "sport": "$$d.title", 
      "profession": { 
       "$arrayElemAt": [ 
       "$profile.profession", 
       { "$indexOfArray": [ "$profile.departament", "$$d._id" ] } 
       ]  
      }, 
      "title": "$$d.title", 
      "category": "$$d.category" 
      } 
     } 
     } 
    }  
    }} 
]) 

在我们期待从01“索引位置”,首先指数数组匹配指定字段上的当前值_id。然后通过$arrayElemAt提取该索引处的数据。

或者用“周围的其他方法” $filter$arrayElemAt与MongoDB的3.2:

db.collection.aggregate([ 
    { "$addFields": { 
    "Institution": { 
     "departament": { 
     "$map": { 
      "input": "$Institution.departament", 
      "as": "d", 
      "in": { 
      "sport": "$$d.title", 
      "profession": { 
       "$arrayElemAt": [ 
       { "$map": { 
        "input": { 
        "$filter": { 
         "input": "$profile", 
         "as": "p", 
         "cond": { "$eq": [ "$$p.departament", "$$d._id" ] }      
        } 
        }, 
        "as": "p", 
        "in": "$$p.profession" 
       }}, 
       0 
       ] 
      }, 
      "title": "$$d.title", 
      "category": "$$d.category" 
      } 
     } 
     } 
    }  
    }} 
]) 

在这种情况下,$filter降低"profile"下降到仅匹配元素阵列的内容,这应该是只是一个。然后通过$arrayElemAt0索引处提取。

同样的结果在这两种情况下:

{ 
    "_id" : ObjectId("597233b50e717e0585dbd94a"), 
    "createdAt" : ISODate("2017-07-21T17:02:45.119Z"), 
    "name" : "cardoso", 
    "gender" : "female", 
    "profile" : [ 
     { 
      "profession" : "master", 
      "_id" : ObjectId("597233b50e717e0585dbd94b"), 
      "departament" : ObjectId("597233b50e717e0585dbd94e") 
     }, 
     { 
      "_id" : ObjectId("59766719003e7d552fe40e8c"), 
      "profession" : "master", 
      "departament" : ObjectId("59766719003e7d552fe40e8b") 
     }, 
     { 
      "_id" : ObjectId("5976b8f99d8a4326c6bf1ae5"), 
      "profession" : "master", 
      "departament" : ObjectId("5974d8fe398e5b2fd433410f") 
     } 
    ], 
    "Institution" : { 
     "_id" : ObjectId("597233b50e717e0585dbd94c"), 
     "cnpj" : 64837134000144.0, 
     "deletedAt" : false, 
     "departament" : [ 
      { 
       "sport" : "cardoso", 
       "profession" : "master", 
       "title" : "cardoso", 
       "category" : "Sub-17" 
      }, 
      { 
       "sport" : "novo", 
       "profession" : "master", 
       "title" : "novo", 
       "category" : "Sub-12" 
      }, 
      { 
       "sport" : "testeJJJ", 
       "profession" : "master", 
       "title" : "testeJJJ", 
       "category" : "Intercâmbio" 
      } 
     ] 
    } 
}