V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
kidlfy
V2EX  ›  Python

请教一个 mongodb 插入操作

  •  
  •   kidlfy · 2019-04-16 15:58:28 +08:00 · 2019 次点击
    这是一个创建于 1830 天前的主题,其中的信息可能已经有所发展或是发生改变。

    对数组中的字典的 key 怎么进行存在就更新 value 值,key 不存在则插入这样的批量操作呢

    第 1 条附言  ·  2019-04-16 18:23:16 +08:00

    好像是我没表述清楚
    ''' [{'timestamp': '1555387200', u'value': u'50'},{'timestamp': '1555387500', u'value': u'50'},] '''
    是这样的list 如果库里的数组里有了这个timestamp 就更新value 没有就直接插入。 我没找到合适的方式,最后是先查了一遍存在就删除了,最后整个数组再整个插入的。不知道还有没有好的方法。感谢🙏

    12 条回复    2019-04-17 00:27:41 +08:00
    muxiesan1989
        1
    muxiesan1989  
       2019-04-16 16:13:05 +08:00
    可以试试 db.update({ key: item }, item, True)
    luanguang
        2
    luanguang  
       2019-04-16 16:23:18 +08:00
    试试 update_many()方法?找到符合条件的然后更新,没有就直接插入。
    Orenoid
        3
    Orenoid  
       2019-04-16 16:54:33 +08:00
    先给个基本的数据结构吧,而且看你描述更像是更新操作而不是插入操作
    aaa5838769
        4
    aaa5838769  
       2019-04-16 17:11:28 +08:00
    http://www.runoob.com/mongodb/mongodb-update.html 你看下有你解决的方案没。
    fds
        5
    fds  
       2019-04-16 19:03:16 +08:00
    没试过,其实主要就是 upsert: true,但记得好像有坑。批量的话:
    db.collection.bulkWrite( [
    { updateOne :
    {
    "filter" : {'timestamp': '1555387200'},
    "update" : {'timestamp': '1555387200', u'value': u'50'},
    "upsert" : true,
    }
    },
    { updateOne :
    {
    "filter" : {'timestamp': '1555387500'},
    "update" : {'timestamp': '1555387500', u'value': u'50'},
    "upsert" : true,
    }
    },
    ] )
    menyakun
        6
    menyakun  
       2019-04-16 19:07:29 +08:00
    db.collection.update(query, update, { "upsert": true });
    官方文档的原话是“ Optional. If set to true, creates a new document when no document matches the query criteria. The default value is false, which does not insert a new document when no match is found.”
    oblivious
        7
    oblivious  
       2019-04-16 21:23:40 +08:00
    我可以讲一下 pymongo 是怎么弄的:

    db.your_table.find_one_and_update({'timestamp': 1555387200}, {'$set': {'value': '10086'}})

    于是你的数据就变成了

    [{'timestamp': '1555387200', u'value': u'10086'},{'timestamp': '1555387500', u'value': u'50'},]
    brickyang
        8
    brickyang  
       2019-04-16 21:38:12 +08:00
    操作数组中 item 的 key 的方法是 array.$.field

    文档: https://docs.mongodb.com/manual/reference/operator/update/positional/
    brickyang
        9
    brickyang  
       2019-04-16 21:39:55 +08:00
    上面有人说的 upsert 是不对的。upsert 是针对「文档」的(如果查找的文档不存在则插入新文档)。

    $ 操作符的文档中也说了不能同时使用 $ 和 upsert。
    SlipStupig
        10
    SlipStupig  
       2019-04-17 00:24:44 +08:00
    @oblivious 这样会插入重复数据,好的方法是用$addToSet 操作符,参考 https://docs.mongodb.com/manual/reference/operator/update/addToSet/
    SlipStupig
        11
    SlipStupig  
       2019-04-17 00:26:46 +08:00
    用 db.your_collection.update({"value": 50}, {$addToSet: {"value": 50}}}, {upsert: true}),这样就可以了
    SlipStupig
        12
    SlipStupig  
       2019-04-17 00:27:41 +08:00
    这种时序任务 MongoDB 并不合适,influxdb 会更合适
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1125 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:35 · PVG 07:35 · LAX 16:35 · JFK 19:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.