2017-07-29 43 views
1

我有三個集合。如何在mongo中使用id找到三個集合之間的結果

用戶收集:

{ 
    "_id" : ObjectId("58a0506767535d5cehjk678"), 
    "name" : "someUser", 
    "username" : "someUserName" 
} 

培訓:

{ 
    "_id" : ObjectId("5hkhgec28863b500045ff0d6"), 
    "location" : "somePlace", 
    "coacherId" : "58b9edca8863b500045ff0d0", // userId 
    "maxParticipants" : NumberInt(10), 
    "time" : ISODate("2017-03-05T17:00:00.000+0000") 
} 

userOrders:

{ 
    "_id" : ObjectId("591iuyt602d3ec00049b7c93"), 
    "userId" : "5hkhgec28863b500045ff0d6", 
    "trainingId" : "5hkhgec28863b500045ff0d6" 
} 

我怎麼能找到兩個日期之間的特定用戶的所有訓練? mongo中只有3個查詢纔有它?

+0

爲什麼你需要第三個集合,你可以只在用戶集合中添加一個訓練ID或用戶的數組訓練集合中的信息。 – abdul

+0

,因爲我需要有關任何訂單的更多詳細信息,例如開始日期和日期。 – israelor

回答

0

它可以使用MongoDB的聚合功能和$lookup聚合階段實現。

事情是這樣的:

db.userOrders.aggregate(
    [ 
     { 
      $match: { 
       "userId" : ObjectId("597c95e3acc4ed0de91a2992") // the id of the user 
      } 
     }, 
     { 
      $lookup: { 
       "from" : "training", 
       "localField" : "trainingId", 
       "foreignField" : "_id", 
       "as" : "training" 
      } 
     }, 
     { 
      $unwind: { 
       path : "$training" 
      } 
     }, 
     { 
      $match: { 
       "training.time" : { $gte: ISODate("2017-03-05T00:00:00.0Z"), $lt: ISODate("2017-03-08T00:00:00.0Z") } 
      } 
     }, 
     // if you use MongoDB version >= 3.4 
     { 
      $replaceRoot: { 
       newRoot: "$training" 
     } 
    } 
    ] 
); 

示例輸出文件:

{ 
    "_id" : ObjectId("597c9608acc4ed0de91a2995"), 
    "location" : "somePlace", 
    "coacherId" : "\"Joe\"", 
    "maxParticipants" : NumberInt(10), 
    "time" : ISODate("2017-03-05T17:00:00.000+0000") 
} 
相關問題