当前位置: 首页 > 面试题库 >

如何使用pymongo更新值?

谭文林
2023-03-14
问题内容

我有以下形式的mongodb集合:

{id=ObjectId(....),key={dictionary of values}}
where dictionary of values is {'a':'1','b':'2'.....}

让值字典为'd'。我需要更新中的键值'd'。即我想更改'a':'1''a':'2' pymongo中的该怎么办?

代码是这样的:

productData is a collecthtml" target="_blank">ion in mongoDB
for p in productData.find():
     for k,v in p.iteritems():
         value=v['a']
         value=value+1
         v['a']=value

现在在productData中反映新值。

这是我尝试过的方法,它引入了一个新的键值对,而不是更新

for p in productData.find():
    for k,v in p.iteritems():
         value=v['a']
         value=value+1
         v['a']=value
         productData.update({'_id':mongoId},{"$set":{'d.a':'100'}},upsert=False)

问题答案:

如果要将文档的值设置为任意值,可以使用$
set语法。如果该属性已经存在于文档中,则将更新值;如果不存在,则将创建该值。如果您需要像描述的那样在字典中设置单个值,则可以使用点表示法来访问子值。

如果p是检索到的对象:

existing = p['d']['a']

对于pymongo版本 <3.0

db.ProductData.update({
  '_id': p['_id']
},{
  '$set': {
    'd.a': existing + 1
  }
}, upsert=False, multi=False)

对于pymongo版本 > = 3.0

db.ProductData.update_one({
  '_id': p['_id']
},{
  '$set': {
    'd.a': existing + 1
  }
}, upsert=False)

但是,如果只需要增加该值,则当多个请求可以同时运行时,此方法可能会带来问题。相反,您应该使用$ inc语法:

对于 <3.0的pymongo版本:

db.ProductData.update({
  '_id': p['_id']
},{
  '$inc': {
    'd.a': 1
  }
}, upsert=False, multi=False)

对于pymongo版本 > = 3.0:

db.ProductData.update_one({
  '_id': p['_id']
},{
  '$inc': {
    'd.a': 1
  }
}, upsert=False)

这样可以确保您的增量将始终如一。



 类似资料:
  • 我想更新现有mongodb文档中的字段。但设定值应为旧值和新值的平均值。 我可以从mongodb文档中获取旧值并计算平均值,并将其设置到字段中,但这不是线程安全性,在计算平均值时,mongodb文件中的旧值可能会更改。 示例,文档: { ' _ id ':ObjectId(" 55d 49338 b 9796 c 337 c 894 df 3 "),值:10 } Python代码: 以前: { '

  • 我在Elasticsearch中索引了一个文档,如下所示: 我尝试通过以下命令更新计数字段: 但是,我收到了以下错误: 我到底做了什么,却不见了?我在http://www.elasticsearch.org/guide/reference/api/update.html跟踪文件,但它不起作用。 此外,我还包括父字段: 但还是没有成功。有人能帮我解决这个错误吗?

  • 我是java语言新手,我正在尝试创建一个GUI,它有JComboBox,允许用户选择其中一个选项,并根据所选选项,通过添加更多文本字段来更新面板。目前我面临的一个问题是,如果我选择(选项1),面板不会更新,它应该显示5个文本字段及其标签。 我的问题是:如何更新面板以根据用户从JComboBox中选择的选项添加更多文本字段? 此外,我还面临另一个问题,我无法找到设置JFrame大小的方法 这是我的代

  • 问题内容: 我在查询mongoDB时尝试使用排序功能,但是失败了。相同的查询在MongoDB控制台中有效,但不适用于此处。代码如下: 我得到的错误如下: 我在其他地方找到了一个链接,该链接说如果使用pymongo,则需要在密钥的前面放置一个“ u”,但这也不起作用。任何其他人都可以使用它或这是一个错误。 问题答案: 在pymongo中,采用和作为参数。 因此,假设您要排序,那么您应该 对于多个字段

  • 问题内容: 我想用Django更新表格-原始SQL中的内容如下: 我的第一个结果是这样的-但这很讨厌,不是吗? 有没有更优雅的方式? 问题答案: UPD Django 2.2版本现在具有bulk_update。 请参阅以下django文档部分 一次更新多个对象 简而言之,你应该可以使用: 你还可以使用F对象来执行诸如增加行数之类的操作: 请参阅文档:https : //docs.djangopro

  • 我的@cacheable方法有下一个签名: 该过滤器使用reporisoty,以limit作为分页参数,返回实体列表。我正在尝试在向系统添加实体时更新缓存: java.lang.ClassCastException:不能将com.java.domain.Entity强制转换为java.util.List