2017-10-10 121 views
0

如何從多個集合投影有限的字段?我有三個集合,我正在使用$ lookup,$ project。三個中,我只能使用$ project限制一個集合的字段。當我只需要3到4個場地時,剩下的兩個就成了一個整體。

 let bsonMatch = BSON() 
      bsonMatch.append(key: jsonConstants.email, string: emailAddress) 

      let match = BSON() 
      match.append(key: "$match", document: bsonMatch) 


     bsonFields.append(key: jsonConstants.email, int: 1) 
     bsonFields.append(key: jsonConstants.compId, int: 1) 
     bsonFields.append(key: jsonConstants.role, int: 1) 
     bsonFields.append(key: jsonConstants.fullName, int: 1) 
     bsonFields.append(key: jsonConstants.mobile, int: 1) 
     bsonFields.append(key: jsonConstants.homeTele, int: 1) 
     bsonFields.append(key: jsonConstants.zipCode, int: 1) 
     bsonFields.append(key: jsonConstants.gender, int: 1) 




     let compObject = BSON() 

      compObject.append(key: jsonConstants.compName, int: 1) 
      compObject.append(key: jsonConstants.compId, int: 1) 
      compObject.append(key: jsonConstants.compAddress, int: 1) 



      let compProject = BSON() 

      compProject.append(key: "$project", document: compObject) 

     let compLookup = BSON() 

      compLookup.append(key: "from", string: dbTableConstants.companyTable) 
      compLookup.append(key: "localField", string: jsonConstants.compId) 
      compLookup.append(key: "foreignField", string: jsonConstants.compId) 
      compLookup.append(key: "as", string: "company") 






      let lookup = BSON() 
      lookup.append(key: "$lookup", document: bsonLookUp) 



      let compBson = BSON() 

      compBson.append(key: "$lookup", document: compLookup) 


      var bsonQuery = BSON() 
      bsonQuery.append(key: "0", document: match) 
      bsonQuery.append(key: "1", document: project) 
      bsonQuery.append(key: "2", document: lookup) 
     // bsonQuery.append(key: "3", document: compBson) 
      bsonQuery.append(key: "3", document: compLookup) 





      let pipline = try? BSON(json: bsonQuery.asArrayString) 

      print(bsonQuery.asArrayString) 

      guard let serverResult = userCollection.aggregate(pipeline: pipline!) else{ 
       response.setBody(string: responseMsg(msg: msgConstants.internalServerError, success: false)) 
       response.status = HTTPResponseStatus.internalServerError 
       response.completed() 
       return 

      } 

在這個片段中,我只給出了兩個集合,我希望這兩個集合都只能投影選擇性字段。 第一個預測是usertable,另一個是公司表。關係:用戶屬於某個公司。所以我需要該特定用戶的必要公司的詳細信息。

+2

請您粘貼代碼...這將讓人們更方便 – AlexWoe89

+0

請檢查。謝謝。 –

回答

0

我終於找到了我失蹤的東西。即使來自多個集合的字段也需要在一個$項目操作中。我們可以查找多個表格,然後可以將每個表格中的選擇性字段添加到項目中。 所以上面的代碼將是:

 let bsonMatch = BSON() 
     bsonMatch.append(key: jsonConstants.email, string: emailAddress) 

     let match = BSON() 
     match.append(key: "$match", document: bsonMatch) 


    bsonFields.append(key: jsonConstants.email, int: 1) 
    bsonFields.append(key: jsonConstants.compId, int: 1) 
    bsonFields.append(key: jsonConstants.role, int: 1) 
    bsonFields.append(key: jsonConstants.fullName, int: 1) 
    bsonFields.append(key: jsonConstants.mobile, int: 1) 
    bsonFields.append(key: jsonConstants.homeTele, int: 1) 
    bsonFields.append(key: jsonConstants.zipCode, int: 1) 
    bsonFields.append(key: jsonConstants.gender, int: 1) 




    let compObject = BSON() 

     compObject.append(key: jsonConstants.compName, int: 1) 
     compObject.append(key: jsonConstants.compId, int: 1) 
     compObject.append(key: jsonConstants.compAddress, int: 1) 





    let compLookup = BSON() 

     compLookup.append(key: "from", string: dbTableConstants.companyTable) 
     compLookup.append(key: "localField", string: jsonConstants.compId) 
     compLookup.append(key: "foreignField", string: jsonConstants.compId) 
     compLookup.append(key: "as", string: "company") 

     bsonFields.append(key: "company", document: compObject) 

    let project = BSON() 
      project.append(key: "$project", document: bsonFields) 

     let lookup = BSON() 
     lookup.append(key: "$lookup", document: bsonLookUp) 



     let compBson = BSON() 

     compBson.append(key: "$lookup", document: compLookup) 


     var bsonQuery = BSON() 
     bsonQuery.append(key: "0", document: match) 
     bsonQuery.append(key: "1", document: compBson) 
     bsonQuery.append(key: "2", document: project) 








     let pipline = try? BSON(json: bsonQuery.asArrayString) 

     print(bsonQuery.asArrayString) 

     guard let serverResult = userCollection.aggregate(pipeline: pipline!) else{ 
      response.setBody(string: responseMsg(msg: msgConstants.internalServerError, success: false)) 
      response.status = HTTPResponseStatus.internalServerError 
      response.completed() 
      return 

     }