我的字典看起来像这样:
{
"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}}})
命令,它会用新信息替换股票内的所有内容。
我有什么方法可以更新现有记录,甚至可以添加新记录?
答案 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"在您的推送操作中,子文档将正确附加到数组。