【问题标题】:How do I use mongodb $lookup with a nested array?如何将 mongodb $lookup 与嵌套数组一起使用?
【发布时间】:2019-03-26 15:55:16
【问题描述】:

我正在尝试执行一个组合两个集合的搜索查询。

集合 1 称为 stock 集合。

{ "fruit_id" : "1", "name" : "apples", "stock": 100 }
{ "fruit_id" : "2", "name" : "oranges", "stock": 50 }
{ "fruit_id" : "3", "name" : "plums", "stock": 60 } 

集合 2 称为 orders 集合

{ "order_id" : "001", "ordered_fruits":
    [
     {"fruit_id" : "1", "name" : "apples", "ordered" : 5},
     {"fruit_id" : "3", "name" : "plums", "ordered" : 20}
    ]
}
{ "order_id" : "002", "ordered_fruits":
    [
     {"fruit_id" : "2", "name" : "oranges", "ordered" : 30},
     {"fruit_id" : "3", "name" : "plums", "ordered" : 20}
    ]
}

我正在尝试编写一个返回 stock 集合的查询,该集合带有一个表示订购水果总量的附加密钥对。

{ "fruit_id" : "1", "name" : "apples", "stock": 100, "ordered": 5 }
{ "fruit_id" : "2", "name" : "oranges", "stock": 50, "ordered": 30 }
{ "fruit_id" : "3", "name" : "plums", "stock": 60, "ordered": 40 }

我曾尝试使用聚合框架中的 $lookup,但嵌套数组会变得复杂。我现在很困。

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    你可以使用下面的聚合

    db.stock.aggregate([
      { "$lookup": {
        "from": "orders",
        "let": { "fruitId": "$fruit_id" },
        "pipeline": [
          { "$match": { "$expr": { "$in": ["$$fruitId", "$ordered_fruits.fruit_id"] }}},
          { "$unwind": "$ordered_fruits" },
          { "$match": { "$expr": { "$eq": ["$ordered_fruits.fruit_id", "$$fruitId"] }}}
        ],
        "as": "orders"
      }},
      { "$project": {
        "ordered": { "$sum": "$orders.ordered_fruits.ordered" },
        "fruit_id" : 1, "name" : 1, "stock": 1
      }}
    ])
    

    MongoPlayground

    【讨论】:

    • 完美运行!
    猜你喜欢
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多