聚合以创建具有嵌套文档值的文档

Posted

技术标签:

【中文标题】聚合以创建具有嵌套文档值的文档【英文标题】:Aggregate to create documents with values of a nested document 【发布时间】:2021-12-13 05:50:03 【问题描述】:

我想使用 pyMongo 创建一个聚合文档,它通过嵌套文档的每个值生成一个文档。

我的输入集合:

  
    "Id" : "12345-7",
    "Price: 
    
            "Base" : "9.99",
            "Promo" : "7.99"
    ,
    "Stock" : [ 
            
                "Code" : "1",
                "Qty" : 1.0
            , 
            
                "Code" : "3",
                "Qty" : 7.0
            
        ]
    
     
    "Id" : "22222-0",
    "Price: 
    
            "Base" : "2.99",
            "Promo" : "2.99"
    ,
    "Stock" : [ 
            
                "Code" : "3",
                "Qty" : 10.0
            , 
            
                "Code" : "5",
                "Qty" : 1.0
            ,
            
                "Code" : "10",
                "Qty" : 2.0
            
         ]
    

我预期的聚合输出:


item_id : "12345-7",
store: "1",
price : 9.99,
quantity : 1,
sale_price: 7.99,


item_id : "12345-7",
store: "3",
price : 9.99,
quantity : 7,
sale_price: 7.99


item_id : 22222-0",
store: "3",
price : 2.99,
quantity : 10,
sale_price: 2.99


item_id : 22222-0",
store: "5",
price : 2.99,
quantity : 1,
sale_price: 2.99


item_id : 22222-0",
store: "10",
price : 2.99,
quantity : 2,
sale_price: 2.99

其中 store 等于 code,price 等于 base,sales_price 等于 promo,item_id 等于 Id,quantity 等于输入集合中的 Qty。

到目前为止我做了什么:

db.getCollection('File').aggregate([

    "$project" :
    
        "price" : "$Price.Base",
        "sale_price" : "$Price.Promo",
        "item_id" : "$Id",
        "Stock" : 1
    
,

    "$unset" : "Price"  

])

我尝试使用$unwind,但没有成功。如果可能的话,如何使用简单的聚合获得预期的输出。就像我之前说的,我正在使用 pyMongo 来执行这个聚合

【问题讨论】:

【参考方案1】: $unwind $project
db.collection.aggregate([
  
    "$unwind": "$Stock"
  ,
  
    "$project": 
      item_id: "$Id",
      store: "$Stock.Code",
      price: "$Price.Base",
      quantity: "$Stock.Qty",
      sale_price: "$Price.Promo",
      
    
  
])

mongoplayground

【讨论】:

以上是关于聚合以创建具有嵌套文档值的文档的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB:嵌套值的聚合计算

使用MongoDB聚合将数据收集成分层结果以节省带宽

(Elasticsearch)如何获取所有文档的嵌套字段的最后一个元素然后执行子聚合

当数据非常嵌套时如何使用 $gt 聚合文档和聚合 Pymongo

慢聚合:按照过滤+嵌套对象排序文档

MongoDB 聚合 - 我如何“$lookup”嵌套文档“_id”?