PyMongo更新包含多条记录的文档

时间:2016-12-13 01:31:01

标签: mongodb pymongo

我的字典看起来像这样:

{
    "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}}})命令,它会用新信息替换股票内的所有内容。

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

2 个答案:

答案 0 :(得分: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}})

对于上传项目,这是一个两步过程。您首先需要以与上述更新现有项目相同的方式运行查询,并检查上述查询中的写入结果响应并检查修改后的计数。如果修改后的计数为0表示我们需要进行upsert,那么您就像添加新项目一样。

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

如果nmodified等于0,请检查 WriteResult

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

如果nmodified等于1,则upserting成功。

答案 1 :(得分:0)

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