如何在 mongodb 中的同一集合的不同文档中查询大于值的值?

How to query greater than values in different documents from same collection in mongodb?

我有一个销售集合如下。我想使用 mongo shell 来查询成本大于 20 的产品详细信息。

[{
  "Customer_Info":{
        "Customer_Id": 1,
      "First_Name": "John",
      "Last_Name": "Smith",
      "Address": "Sydney",
      "State": "Sydney",
      "Postcode": "0920",
      "Phone": "0143464663"
  },
  "Order_Info": [
    {
      "Order_Id": 1,
      "Order_Date": "01-01-2020",
      "Delivery_Date": "01-01-2020",
      "Line_Info": [
        {
          "Line_Id": 1,
          "Line_Price": 100,
          "Line_Units_Added": 2,
          "Product_Info": {
            "Product_Id": 300,
            "Product_Name": "Orange",
            "Product_Description": "Fruit",
            "Number_in_Stock": 50,
            "Product_Weight": 1,
            "Product_Cost": 300,
            "Product_in_Date": "01-01-2020",
            "Product_Type": "Fruits",
            "Farmer_Info": {
              "Farmer_Id": 123,
              "Farmer_First_Name": "Drake",
              "Farmer_Last_Name": "Levine",
              "Farmer_Address": "Sydney",
              "Farmer_State": "Sydney",
              "Farmer_Post_Code": "1200"
            }
          }
        },
        {
          "Line_Id": 5,
          "Line_Price": 25,
          "Line_Units_Added": "1",
          "Product_Info": {
            "Product_Id": 305,
            "Product_Name": "Banana",
            "Product_Description": "Fruit",
            "Number_in_Stock": 100,
            "Product_Weight": 1,
            "Product_Cost": 100,
            "Product_in_Date": "01-01-2020",
            "Product_Type": "Fruits",
            "Farmer_Info": {
              "Farmer_Id": 123,
              "Farmer_First_Name": "Drake",
              "Farmer_Last_Name": "Levine",
              "Farmer_Address": "Sydney",
              "Farmer_State": "Sydney",
              "Farmer_Post_Code": "1200"
            }
          }
        },
        {
          "Line_Id": 6,
          "Line_Price": 100,
          "Line_Units_Added": "1",
          "Product_Info": {
            "Product_Id": 305,
            "Product_Name": "Jackfruit",
            "Product_Description": "Fruit",
            "Number_in_Stock": 20,
            "Product_Weight": 1,
            "Product_Cost": 50,
            "Product_in_Date": "01-01-2020",
            "Product_Type": "Fruits",
            "Farmer_Info": {
              "Farmer_Id": 123,
              "Farmer_First_Name": "Drake",
              "Farmer_Last_Name": "Levine",
              "Farmer_Address": "Sydney",
              "Farmer_State": "Sydney",
              "Farmer_Post_Code": "1200"
            }
          }
        },
        {
          "Line_Id": 7,
          "Line_Price": 200,
          "Line_Units_Added": 1,
          "Product_Info": {
            "Product_Id": 310,
            "Product_Name": "Dragon Fruit",
            "Product_Description": "Fruit",
            "Number_in_Stock": 10,
            "Product_Weight": 1,
            "Product_Cost": 2,
            "Product_in_Date": "01-01-2020",
            "Product_Type": "Fruits",
            "Farmer_Info": {
              "Farmer_Id": 123,
              "Farmer_First_Name": "Drake",
              "Farmer_Last_Name": "Levine",
              "Farmer_Address": "Sydney",
              "Farmer_State": "Sydney",
              "Farmer_Post_Code": "1200"
            }
          }
        }
      ]
    },
    {
      "Order_Id": 2,
      "Order_Date": "01-01-2020",
      "Delivery_Date": "01-01-2020",
      "Line_Info": [
        {
          "Line_Id": 2,
          "Line_Price": 200,
          "Line_Units_Added": 2,
          "Product_Info": {
            "Product_Id": 301,
            "Product_Name": "Mango",
            "Product_Description": "Fruit",
            "Number_in_Stock": 50,
            "Product_Weight": 1,
            "Product_Cost": 500,
            "Product_in_Date": "01-01-2020",
            "Product_Type": "Fruits",
            "Farmer_Info": {
              "Farmer_Id": 123,
              "Farmer_First_Name": "Drake",
              "Farmer_Last_Name": "Levine",
              "Farmer_Address": "Sydney",
              "Farmer_State": "Sydney",
              "Farmer_Post_Code": "1200"
            }
          }
        }
      ]
    }
  ]
},{
  "Customer_Info":{
  "Customer_Id": 2,
  "First_Name": "Popeye",
  "Last_Name": "Sailorman",
  "Address": "Sydney",
  "State": "Sydney",
  "Postcode": "0920",
  "Phone": "123456"},
  "Order_Info": [
    {
      "Order_Id": 3,
      "Order_Date": "01-01-2020",
      "Delivery_Date": "01-01-2020",
      "Line_Info": [
        {
          "Line_Id": 3,
          "Line_Price": 50,
          "Line_Units_Added": 5,
          "Product_Info": {
            "Product_Id": 500,
            "Product_Name": "Spinach",
            "Product_Description": "Vegetables",
            "Number_in_Stock": 30,
            "Product_Weight": 1.5,
            "Product_Cost": 30,
            "Product_in_Date": "01-01-2020",
            "Product_Type": "Veg",
            "Farmer_Info": {
              "Farmer_Id": "420",
              "Farmer_First_Name": "Olive",
              "Farmer_Last_Name": "Lewine",
              "Farmer_Address": "Sydney",
              "Farmer_State": "Sydney",
              "Farmer_Post_Code": "1200"
            }
          }
        }
      ]
    }
  ]
}]

想用mongoshell找出那些大于20的产品名称和产品成本。我做了如下操作:

db.sales.find( { "Order_Info.Line_Info.Product_Info.Product_Cost": { $gt: 20} }, {"_id": 0, 
    "Order_Info.Line_Info.Product_Info.Product_Name": 1, 
    "Order_Info.Line_Info.Product_Info.Product_Cost": 1} ).pretty();

但不幸的是它只返回第一个文档值。如何实现?

您可以通过聚合实现此目的

  1. $map 有助于处理数组中的每个元素
  2. $filter 有助于使用条件和过滤器

Mongo 脚本

[
  {
    $project: {
      Order_Info: {
        $map: {
          input: "$Order_Info",
          in: {
            $filter: {
              input: "$$this.Line_Info",
              cond: {
                $gt: [
                  "$$this.Product_Info.Product_Cost",
                  30
                ]
              }
            }
          }
        }
      }
    }
  }
]

工作Mongo playground