如何在MongoDB中保留附加子文档?

时间:2015-04-23 04:51:20

标签: mongodb pymongo

我正在尝试使用PyMongo在MongoDB中进行批量插入。 我有数以百万计的产品/评论文档要插入MongoDB。这是文件的结构:

{
    "_id" : ObjectId("553858a14483e94d1e563ce9"),
    "product_id" : "B000GIKZ4W",
    "product_category" : "Arts",
    "product_brand" : "unknown",
    "reviews" : [
        {
            "date" : ISODate("2012-01-09T00:00:00Z"),
            "score" : 3,
            "user_id" : "A3DLA3S8QKLBNW",
            "sentiment" : 0.2517857142857143,
            "text" : "The ink was pretty dried up upon arrival. It was...",
            "user_gender" : "male",
            "voted_total" : 0,
            "voted_helpful" : 0,
            "user_name" : "womans_roar \"rohrra\"",
            "summary" : "Cute stamps but came with dried up ink"
        }
    ],
    "product_price" : "9.43",
    "product_title" : "Melissa & Doug Deluxe Wooden Happy Handle Stamp Set"
} 

单个产品可以有多个评论。要求是每个product_id插入一个文档,并在review数组中继续附加更多的评论作为子文档。能否请您就如何实现这一目标提供一些指导?此外,为了提高性能,还可以很好地实现批量插入。

1 个答案:

答案 0 :(得分:1)

  

很高兴为性能实现批量插入。

在pymongo中可以执行Ordered bulk write operationsUnordered Bulk Write Operations

  

要求是每个product_id插入一个文档,并在评论数组中继续附加更多评论作为子文档

您可以使用update_oneupdate_many(Pymongo 3或更新版本)或update方法将$push子文档用于reviews数组

collection.update_one({"_id": <doc_id>}, {"$push": {"reviews": <subdocument>}})

 
collection.update({"_id": <doc_id>}, {"$push": {"reviews": <subdocument>}})

如果没有文档符合给定条件,要插入需要文档,请使用upsert选项

 
collection.update({"_id": <doc_id>}, {"$push": {"reviews": <subdocument>}}, upsert=True)