【问题标题】:PyMongo Update document with multiple recordsPyMongo 更新包含多条记录的文档
【发布时间】:2017-04-28 00:01:03
【问题描述】:

我有一本像这样的字典:

{
    "username": "SHAURYA",
    "stocks": [{
        "name": "WXYZ",
        "count": 2,
        "price": 100
    }, {
        "name": "GOOG",
        "count": 3,
        "price": 300
    }, {
        "name": "QQV",
        "count": 5,
        "price": 300
    }, {
        "name": "AAPL",
        "count": 6,
        "price": 300
    }, {
        "name": "SN",
        "count": 4,
        "price": 300
    }]
}

我需要能够更新单个股票以及向其中添加新股票。

如果我使用db.cmpe285.update({"username":username}, {"$push": {"stocks":{"name":stock_symbol,"count":allotment,"price":initial_share_price}}}) 命令,数据库不会更新。

如果我使用db.cmpe285.update({"username":username}, {"$set": {"stocks":{"name":stock_symbol,"count":allotment,"price":initial_share_price}}}) 命令,它将用新信息替换股票内的所有内容。

有什么方法可以更新现有记录,甚至添加一条新记录?

【问题讨论】:

    标签: mongodb pymongo


    【解决方案1】:

    MongoDB 区分大小写。在推送操作中使用“stocks”而不是“Stocks”,子文档将正确附加到数组中。

    【讨论】:

    • 那只是一个错字。它也是命令中的“股票”。
    【解决方案2】:

    对于新项目

    db.cmpe285.update({"username":username}, {"$push": {"stocks":{"name":stock_symbol,"count":allotment,"price":initial_share_price}}})
    

    用于更新现有项目,假设您正在更新分配。您需要使用位置运算符($)和查询中引用的数组值。

    db.cmpe285.update({"username":username, "stocks.name":stock_symbol}, {"$set": {"stocks.$.count":allotment2}})
    

    对于更新插入项目,这是一个 2 步过程。您首先需要以与上述更新现有项目相同的方式运行查询,并检查上述查询的写入结果响应并检查修改后的计数。如果修改后的计数为 0,则意味着我们需要 upsert,然后您只需像添加新项目一样执行此操作。

    db.cmpe285.update({"username":username, "stocks.name":stock_symbol}, {"$set": {"stocks.$.count":allotment2}})
    

    检查 WriteResult,如果 nmodified 等于 0。

    db.cmpe285.update({"username":username}, {"$push": {"stocks":{"name":stock_symbol,"count":allotment2,"price":initial_share_price}}})
    

    如果nmodified等于1,则插入成功。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 2020-07-06
      • 2019-02-18
      • 1970-01-01
      • 2016-05-01
      相关资源
      最近更新 更多