繁体   English   中英

$out , $mongodb 中的投影

[英]$out ,$projection in mongodb

我想使用 $out 或 $merge 将记录保存在新集合中。

     **/////collection 2- reservationdeatils////**
         "_id":ObjectId("5e4a898947363e964a886420"),
         "phoneNo" : 98765#####,
         "name" : "name1",
         "userId":ObjectId("5e1efac668c3c811c83263cc"),
         "approversId":ObjectId("5e1efad268c3c811c83263cd")
         "bookedForDate":ISODate("2020-02-20T07:23:36.130Z"),
         "bookingDetails" : [
                    {    "_id" : ObjectId("5e44f471d1868d2a54aac12d"),
                         "seatsBooked" : 15,
                         "floorId" : "#IKE01",
                      },
                    {   "_id" : ObjectId("5e44f471d1868d2a54aac12c"),
                        "seatsBooked" : 35,
                        "floorId" : "#HKE04",
                    }
                 ],
     **/////collection 2-priceDetails////**
          {
           "_id" : ObjectId("5e1efb0168c3c811c83263ce"),
           "floorId" : "#IKE01",
           "weekday" : "monday",
            "pricePoint" : 589,
         }
         {
           "_id" : ObjectId("5e2694db54e532a4eb92b477"),
           "floorId" : "#IKE02",
           "weekday" : "thursday",
          "pricePoint" : 699
         }
        {
         "_id" : ObjectId("5e2694f954e532a4eb92b478"),
         "floorId" : "#HKE04",
         "weekday" : "monday",
         "pricePoint" : 579
        }
      **/////collection 3- discount////**
        {
        "_id" :  ObjectId("5e427de64617181a4ce38893"),
        "userId" : ObjectId("5e3d05ba964d0e06c4bb0f07"), 
        "approversId" : ObjectId("5e1d82156a67173cb877f67d"),
        "floorId" : "#IKE01",
        "weekday" : "monday",
        "discount" : 20%,
       },
       {
        "_id" :  ObjectId("5e4281e7fec2e01a4c60b406"),
        "userId" : ObjectId("5e1efac668c3c811c83263cc"), 
        "approversId" : ObjectId("5e1efad268c3c811c83263cd"),
        "floorId" : "#IKE01",
        "weekday" : "monday",
        "discount" : 24%,
     }

现在下面是我尝试过的查询:

     db.reservationdeatils.aggregate([
    {
       '$match': {
          'approverId': ObjectId('5e1efad268c3c811c83263cd'),
          'userId': ObjectId('5e1efac668c3c811c83263cc'),
          'bookedForDate': ISODate("2020-02-11T18:30:00Z"),
        }
     },
     {
      '$unwind': {
          'path': '$bookingDetails',
       },
     }, 
       {
        $lookup:
         {
          from: 'priceDetails',
          let: { floorId: '$bookingDetails.floorId' },
          pipeline: [
              {
                  $match: {
                      weekday: 'monday',
                      $expr: {
                          $eq: ["$floorId", "$$floorId"]
                      }
                  }
              }
          ], as: 'priceDetails'
      }
  },
  { '$unwind': '$priceDetails' },
    {
      $lookup:
      {
          from: 'discount',
          let: { floorId: '$bookingDetails.floorId' },
          pipeline: [
              {
                  $match: {
                      weekday: 'monday',
                      $expr: {
                          $eq: ["$floorId", "$$floorId"]
                      }
                  }
              }
          ], as: 'discounts'
      }
  },
  { '$unwind': '$discounts' },

  {
      '$group': {
          '_id': {
              'floorId': '$bookingDetails.floorId',
              'date': '$bookedForDate',
              'price': '$priceDetails.pricePoint',
              'discount': '$discounts.discount'
          },
          'seatsBooked': {
              '$sum': '$bookingDetails.seatsBooked'
          },
       }
   },
     {
      '$project': {
            'amount': {
              '$multiply':
                   [ 
                     '$seatsBooked',
                        {'$subtract': 
                              ['$_id.pricePoint',
                                 { '$multiply': 
                                   ['$_id.pricePoint', 
                                      { '$divide': 
                                        ['$_id.discount', 100] 
                                   }] 
                               }]
                            }]
                         },
                     },
                   },
      {
          $group: {
           _id: null,
            totalAmount: {
            $sum: "$amount"
          }
      }
  },
    {
      '$project': {
          _id:0,
          totalAmount:1,
          bookedForDate:1,
          'floorId':'$priceDetails.floorId'
       }  
     },{'$merge':'invoice'}
  ]).pretty()

我已经能够达到 totalAmount 但我想要实现的是我想将这些字段保存到“发票”集合“userId”、“approversId”、“floorId”、“sum”、“totalSum”、“bookedForDate” ,"name"但是 1: 每当我使用 $out 而不是 $merge 时,以前的文档都会被替换,而我不想要,2: 如果我每次运行查询时都使用 $merge,则会创建一个新文档,并且只有_id:ObjectId(5e4a899c47363e964a88642f),totalBill:####这些字段,任何建议如何实现

您正朝着好的方向前进,您只需要查看$group聚合。

还有一件事我已经使用了折扣为int值,而不是百分比。

"discount" : 24

我已经更新了查询:

db.reservationdeatils.aggregate([
{
  $match: {
    "userId" : ObjectId("5e1efac668c3c811c83263cc"),
    "approversId" : ObjectId("5e1efad268c3c811c83263cd"),
    "bookedForDate" : ISODate("2020-02-20T07:23:36.130Z")
   }
},
{
 $unwind: {
     path: "$bookingDetails",
  },
}, 
{
 $lookup:
  {
   from: "priceDetails",
   let: { floorId: "$bookingDetails.floorId" },
   pipeline: [
       {
           $match: {
               weekday: "monday",
               $expr: {
                   $eq: ["$floorId", "$$floorId"]
               }
           }
       }
   ], 
   as: "priceDetails"
  }
},
{
  $unwind: "$priceDetails" 
},
{
 $lookup:
 {
     from: "discount",
     let: { floorId: "$bookingDetails.floorId" },
     pipeline: [
         {
             $match: {
                 weekday: "monday",
                 $expr: {
                     $eq: ["$floorId", "$$floorId"]
                 }
             }
         }
     ], 
     as: "discounts"
 }
}
,
{ 
  $unwind: "$discounts" 
}
,
{
 $group: {
     "_id": {
         "floorId": "$bookingDetails.floorId",
         "date": "$bookedForDate",
         "price": "$priceDetails.pricePoint",
         "discount": "$discounts.discount"
     },
     "price":{
      $first:"$priceDetails.pricePoint"
     },
     "discount":{
      $first:"$discounts.discount"
     },
     "seatsBooked": {
         $sum: "$bookingDetails.seatsBooked"
     },
  }
}
,
{
$project: {
  "amount": {
    $multiply:
      [
        "$seatsBooked",
        {
          $subtract:[
            "$price",
            {
              $multiply:[
                "$price",
                {
                  $divide:[
                    "$discount",
                    100
                  ]
                }
              ]
            }
          ]
        }
      ]
  },
},
}
,
{
 $group: {
  "_id": null,
   "totalAmount": {
   $sum: "$amount"
   }
  }
},
{
 $project: {
     "_id":0,
     "totalAmount":1,
     "bookedForDate":1,
     "floorId":"$priceDetails.floorId"
  }  
},
{
  $out:"invoice"
}
]).pretty()

这会帮助你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM