首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

请教一个 mongodb 插入操作

  •  
  •   kidlfy · 70 天前 · 1152 次点击
    这是一个创建于 70 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  70 天前

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

    12 回复  |  直到 2019-04-17 00:27:41 +08:00
        1
    muxiesan1989   70 天前
    可以试试 db.update({ key: item }, item, True)
        2
    luanguang   70 天前
    试试 update_many()方法?找到符合条件的然后更新,没有就直接插入。
        3
    Orenoid   70 天前
    先给个基本的数据结构吧,而且看你描述更像是更新操作而不是插入操作
        4
    aaa5838769   70 天前
    http://www.runoob.com/mongodb/mongodb-update.html 你看下有你解决的方案没。
        5
    fds   70 天前
    没试过,其实主要就是 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,
    }
    },
    ] )
        6
    menyakun   70 天前
    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.”
        7
    oblivious   70 天前
    我可以讲一下 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'},]
        8
    brickyang   70 天前
    操作数组中 item 的 key 的方法是 array.$.field

    文档: https://docs.mongodb.com/manual/reference/operator/update/positional/
        9
    brickyang   70 天前
    上面有人说的 upsert 是不对的。upsert 是针对「文档」的(如果查找的文档不存在则插入新文档)。

    $ 操作符的文档中也说了不能同时使用 $ 和 upsert。
        10
    SlipStupig   70 天前
    @oblivious 这样会插入重复数据,好的方法是用$addToSet 操作符,参考 https://docs.mongodb.com/manual/reference/operator/update/addToSet/
        11
    SlipStupig   70 天前
    用 db.your_collection.update({"value": 50}, {$addToSet: {"value": 50}}}, {upsert: true}),这样就可以了
        12
    SlipStupig   70 天前
    这种时序任务 MongoDB 并不合适,influxdb 会更合适
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4316 人在线   最高记录 5043   ·   Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 28ms · UTC 02:13 · PVG 10:13 · LAX 19:13 · JFK 22:13
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1