【问题标题】:Aggregate & insert collection into a different collection in mongodb将集合聚合并插入到 mongodb 中的不同集合中
【发布时间】:2018-08-31 19:37:55
【问题描述】:

我正在尝试将名为 reviews 的集合中的数据合并到另一个名为 products 的集合中。我想将给定product 的所有reviews 合并到products 集合中的product 作为一个名为reviews 的数组。

例如,这里是一个产品对象,后跟一个评论对象:

特定产品 -

对上述产品的一些评论 -

我尝试使用以下代码聚合数据,但我不知道如何将它们插入到 products 集合中。

db.getCollection('reviews').aggregate( [
                  { $match: {db_asin: "3866811659"}},
                  { $group: {_id: null, reviews : { $push:  "$$ROOT" }}},
                  { $out : "products.db_asin.3866811659" }
              ] )

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework aggregate


    【解决方案1】:

    将聚合更改为产品集合并使用$lookup 从 db_asin 上的另一个集合中提取评论。

    类似

    db.products.aggregate([
      {"$match": {"db_asin": "3866811659"}},
      {"$lookup":{
        "from":"reviews",
        "localField":"db_asin",
        "foreignField":"db_asin",
        "as":"reviews"
      }}
    ]).forEach(function(doc){ 
      var _id = doc._id; 
      var reviews = doc.reviews; 
      db.products.update({"_id" : _id},{"$set": {"reviews" : reviews}})
    }); 
    

    编辑:在 forEach 循环末尾添加右括号

    【讨论】:

    • 您好 Veeram,感谢您的回答。通过这样做,该特定产品下的产品集合现在确实有一个评论数组,但它的所有 mongo 统计信息。
    • 这是评论数组中的内容: "reviews" : [ { "_mongo" : { "slaveOk" : true, "host" : "localhost:27017", "defaultDB" : "test ", "_readMode" : "commands", "_writeMode" : "commands" }, "_db" : { "_mongo" : { "slaveOk" : true, "host" : "localhost:27017" 等等...... ...
    • Np。您如何/在哪里运行此查询?您可以尝试从 mongo shell 运行查询吗?
    • 我最初是在 Robo 3T 中运行它,我尝试在 Shell 中运行它,现在很高兴。奇怪的是,现在代码甚至没有生成评论数组。
    • Ah Veeram 我可以看到这确实有效。它创建了一个名为 products.db_asin 的新集合。 3866811659,无论如何,它不是创建一个新的集合,而是合并到旧的产品集合中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 2016-09-22
    • 1970-01-01
    相关资源
    最近更新 更多