Mongodb 筛选mongo文档和特定于项目的字段

Mongodb 筛选mongo文档和特定于项目的字段,mongodb,aggregation,Mongodb,Aggregation,我是MongoDb的初学者。尝试了很多次,但仍停留在一个问题上。 请在下面给出的页面上查找mongo文档示例: { "_id" : ObjectId("5dc158a60566e14c5190db72"), "hotel_id" : NumberInt(45), "plans" : [ { "plan_type" : "AP", "sub_plans" : [ {

我是MongoDb的初学者。尝试了很多次,但仍停留在一个问题上。 请在下面给出的页面上查找mongo文档示例:

{ 
    "_id" : ObjectId("5dc158a60566e14c5190db72"), 
    "hotel_id" : NumberInt(45), 
    "plans" : [
        {
            "plan_type" : "AP", 
            "sub_plans" : [
                {
                    "channels" : [
                        {
                            "channel_name" : "default", 
                            "status" : "Pending", 
                            "is_active" : false, 
                            "start_date" : NumberLong(1468521000000), 
                            "end_date" : NumberLong(1901125800000), 
                            "non_veg_available" : null, 
                            "oyo_commission" : 20.0, 
                            "ep_price_reduction" : null, 
                            "salesforce_id" : "a0Y280000023LFwEAM", 
                            "breakfast_start_time" : null, 
                            "breakfast_end_time" : null, 
                            "lunch_start_time" : null, 
                            "lunch_end_time" : null, 
                            "dinner_start_time" : null, 
                            "dinner_end_time" : null, 
                            "created_at" : NumberLong(1468577718000), 
                            "updated_at" : NumberLong(1481074321000), 
                            "prices" : [
                                {
                                    "occupancy" : NumberInt(1), 
                                    "guest_type" : null, 
                                    "veg_price" : NumberInt(400), 
                                    "non_veg_price" : null, 
                                    "additional_non_veg_price" : null, 
                                    "discount" : null
                                }
                            ]
                        }, 
                        {
                            "channel_name" : "default", 
                            "status" : "Pending", 
                            "is_active" : false, 
                            "start_date" : NumberLong(1468521000000), 
                            "end_date" : NumberLong(1901125800000), 
                            "non_veg_available" : null, 
                            "oyo_commission" : 20.0, 
                            "ep_price_reduction" : null, 
                            "salesforce_id" : "a0W28000004GqL4", 
                            "breakfast_start_time" : "7:30", 
                            "breakfast_end_time" : "10:00", 
                            "lunch_start_time" : "12:30", 
                            "lunch_end_time" : "15:00", 
                            "dinner_start_time" : "19:00", 
                            "dinner_end_time" : "22:30", 
                            "created_at" : NumberLong(1505516604000), 
                            "updated_at" : NumberLong(1505516604000), 
                            "prices" : [
                                {
                                    "occupancy" : NumberInt(1), 
                                    "guest_type" : null, 
                                    "veg_price" : NumberInt(425), 
                                    "non_veg_price" : NumberInt(425), 
                                    "additional_non_veg_price" : 0.0, 
                                    "discount" : null
                                }
                            ]
                        }, 
                        {
                            "channel_name" : "default", 
                            "status" : "Pending", 
                            "is_active" : false, 
                            "start_date" : NumberLong(1468521000000), 
                            "end_date" : NumberLong(1901125800000), 
                            "non_veg_available" : null, 
                            "oyo_commission" : 20.0, 
                            "ep_price_reduction" : null, 
                            "salesforce_id" : "a0W28000004GqL4", 
                            "breakfast_start_time" : "7:30", 
                            "breakfast_end_time" : "10:00", 
                            "lunch_start_time" : "12:30", 
                            "lunch_end_time" : "15:00", 
                            "dinner_start_time" : "19:00", 
                            "dinner_end_time" : "22:30", 
                            "created_at" : NumberLong(1505709978000), 
                            "updated_at" : NumberLong(1542162045000), 
                            "prices" : [
                                {
                                    "occupancy" : NumberInt(1), 
                                    "guest_type" : null, 
                                    "veg_price" : NumberInt(425), 
                                    "non_veg_price" : NumberInt(425), 
                                    "additional_non_veg_price" : 0.0, 
                                    "discount" : null
                                }
                            ]
                        }
                    ], 
                    "sub_plan_type" : "Standard", 
                    "is_sub_plan_default" : false
                }
            ]
        }, 
        {
            "plan_type" : "EP", 
            "sub_plans" : [
                {
                    "channels" : [
                        {
                            "channel_name" : "default", 
                            "status" : "Pending", 
                            "is_active" : false, 
                            "start_date" : NumberLong(1468521000000), 
                            "end_date" : NumberLong(1901125800000), 
                            "non_veg_available" : null, 
                            "oyo_commission" : null, 
                            "ep_price_reduction" : NumberInt(80), 
                            "salesforce_id" : "a0Y280000023LG1EAM", 
                            "breakfast_start_time" : null, 
                            "breakfast_end_time" : null, 
                            "lunch_start_time" : null, 
                            "lunch_end_time" : null, 
                            "dinner_start_time" : null, 
                            "dinner_end_time" : null, 
                            "created_at" : NumberLong(1468577718000), 
                            "updated_at" : NumberLong(1481074321000), 
                            "prices" : [
                                {
                                    "occupancy" : NumberInt(1), 
                                    "guest_type" : null, 
                                    "veg_price" : null, 
                                    "non_veg_price" : null, 
                                    "additional_non_veg_price" : null, 
                                    "discount" : null
                                }
                            ]
                        }
                    ], 
                    "sub_plan_type" : "Standard", 
                    "is_sub_plan_default" : false
                }
            ]
        }, 
        {
            "plan_type" : "MAP", 
            "sub_plans" : [
                {
                    "channels" : [
                        {
                            "channel_name" : "default", 
                            "status" : "Pending", 
                            "is_active" : false, 
                            "start_date" : NumberLong(1468521000000), 
                            "end_date" : NumberLong(1901125800000), 
                            "non_veg_available" : null, 
                            "oyo_commission" : 20.0, 
                            "ep_price_reduction" : null, 
                            "salesforce_id" : "a0Y280000023LG6EAM", 
                            "breakfast_start_time" : null, 
                            "breakfast_end_time" : null, 
                            "lunch_start_time" : null, 
                            "lunch_end_time" : null, 
                            "dinner_start_time" : null, 
                            "dinner_end_time" : null, 
                            "created_at" : NumberLong(1468577718000), 
                            "updated_at" : NumberLong(1481074321000), 
                            "prices" : [
                                {
                                    "occupancy" : NumberInt(1), 
                                    "guest_type" : null, 
                                    "veg_price" : NumberInt(200), 
                                    "non_veg_price" : null, 
                                    "additional_non_veg_price" : null, 
                                    "discount" : null
                                }
                            ]
                        }, 
                        {
                            "channel_name" : "default", 
                            "status" : "Pending", 
                            "is_active" : false, 
                            "start_date" : NumberLong(1468521000000), 
                            "end_date" : NumberLong(1901125800000), 
                            "non_veg_available" : null, 
                            "oyo_commission" : 20.0, 
                            "ep_price_reduction" : null, 
                            "salesforce_id" : "a0W28000004GqL4", 
                            "breakfast_start_time" : "7:30", 
                            "breakfast_end_time" : "10:00", 
                            "lunch_start_time" : "12:30", 
                            "lunch_end_time" : "15:00", 
                            "dinner_start_time" : "19:00", 
                            "dinner_end_time" : "22:30", 
                            "created_at" : NumberLong(1505709978000), 
                            "updated_at" : NumberLong(1541476001000), 
                            "prices" : [
                                {
                                    "occupancy" : NumberInt(1), 
                                    "guest_type" : null, 
                                    "veg_price" : NumberInt(225), 
                                    "non_veg_price" : NumberInt(225), 
                                    "additional_non_veg_price" : 0.0, 
                                    "discount" : null
                                }
                            ]
                        }
                    ], 
                    "sub_plan_type" : "Standard", 
                    "is_sub_plan_default" : false
                }
            ]
        }
    ]
}
在以下情况下,我只需要选定的字段: 酒店id为45,入住价格为1,活动状态为假,状态为待定,计划类型为['AP','EP']。 期望输出:

{ 
    "_id" : ObjectId("5dc158a60566e14c5190db72"), 
    "hotel_id" : NumberInt(45), 
    "plans" : [
        {
            "plan_type" : "AP", 
            "sub_plans" : [
                {
                    "channels" : [
                        {
                            "channel_name" : "default", 
                            "start_date" : NumberLong(1468521000000), 
                            "end_date" : NumberLong(1901125800000), 
                            "prices" : [
                                {
                                    "veg_price" : NumberInt(425)
                                }
                            ]
                        }, 
                        {
                            "channel_name" : "default", 
                            "start_date" : NumberLong(1468521000000), 
                            "end_date" : NumberLong(1901125800000), 
                            "prices" : [
                                {
                                    "veg_price" : NumberInt(425)
                                }
                            ]
                        }
                    ], 
                    "sub_plan_type" : "Standard", 
                    "is_sub_plan_default" : false
                }
            ]
        }, 
        {
            "plan_type" : "EP", 
            "sub_plans" : [
                {
                    "channels" : [
                        {
                            "channel_name" : "default", 
                            "start_date" : NumberLong(1468521000000), 
                            "end_date" : NumberLong(1901125800000), 
                            "prices" : [
                                {
                                    "veg_price" : null, 
                                }
                            ]
                        }
                    ], 
                    "sub_plan_type" : "Standard", 
                    "is_sub_plan_default" : false
                }
            ]
        }, 
    ]
}
我的问题是:

db.collection.find({
  "hotel_id": 45,
  "plans.plan_type": {$in : ["AP", "EP"]},
  "plans.sub_plans.channels.prices.occupancy": 1,
  "plans.sub_plans.channels.is_active": false,
  "plans.sub_plans.channels.status": "Pending"
})
注意-我只需要搜索一个酒店id为45的文档。 请帮忙。
提前感谢。

您需要应用聚合

db.collection_name.aggregate([

    {
        "$match":{
            "hotel_id": 45,
            "plans.plan_type": "AP",
            "plans.sub_plans.channels.prices.occupancy": 1,
            "plans.sub_plans.channels.is_active": false,
            "plans.sub_plans.channels.status": "Pending"
        }
    },
    {
        "$project":{
            "_id":"$_id",
            "hotel_id":"$hotel_id",
            "plans":"plans"
        }
    }
])


您可能正在寻找这样的查询

db.collection.aggregate([
  {
    "$unwind": "$plans",

  },
  {
    "$group": {
      "_id": "$hotel_id",
      "hotel_id": {
        "$first": "$hotel_id"
      },
      "plans": {
        "$push": {
          "$cond": [
            {
              "$or": [
                {
                  "$eq": [
                    "$plans.plan_type",
                    "AP"
                  ]
                },
                {
                  "$eq": [
                    "$plans.plan_type",
                    "EP"
                  ]
                }
              ]
            },
            {
              "plan_type": "$plans.plan_type",
              "sub_plans": "$plans.sub_plans",
              "sub_plan_type": "$plans.sub_plan_type",
              "is_sub_plan_default": "$is_sub_plan_default"
            },
            null
          ]
        }
      }
    }
  },
  {
    "$project": {
      "_id": 1,
      "hotel_id": 1,
      "plans": {
        "$filter": {
          input: "$plans",
          as: "plan",
          cond: {
            $ne: [
              "$$plan",
              null
            ]
          }
        }
      }
    }
  }
])

谢谢你的回复。但您的查询包含所有计划的结果。我只想要“AP”计划。请看一看并进一步建议。``db.collection\u name.aggregate([{“$match”:{“hotel\u id”:45,“plans.sub\u plans.Channel.prices.Occupation”:1,“plans.sub\u plans.Channel.is\u active”:false,“plans.sub\u plans.Channel.status”:“待定”},{“$match”:{“plans.plan_type”:{“$in”:['AP']}}},{“$project”:{“$id”:“$id”,“hotel_id”:“$hotel_id”,“plans”:“plans”}})“``请再次检查。它不起作用。第一个不起作用,第二个不返回任何文件。请建议。请参阅下面链接的mongo Playder上的第一个正在工作。将答案修改为“NumberPrint(45)”而不是“45”。如何工作?它似乎在mongoplayground上创建的设置上工作。有什么不同?首先,它不工作,请参见。