对数组中的字典的 key 怎么进行存在就更新 value 值,key 不存在则插入这样的批量操作呢
好像是我没表述清楚
'''
[{'timestamp': '1555387200', u'value': u'50'},{'timestamp': '1555387500', u'value': u'50'},]
'''
是这样的list 如果库里的数组里有了这个timestamp 就更新value 没有就直接插入。 我没找到合适的方式,最后是先查了一遍存在就删除了,最后整个数组再整个插入的。不知道还有没有好的方法。感谢🙏
1
muxiesan1989 2019-04-16 16:13:05 +08:00
可以试试 db.update({ key: item }, item, True)
|
2
luanguang 2019-04-16 16:23:18 +08:00
试试 update_many()方法?找到符合条件的然后更新,没有就直接插入。
|
3
Orenoid 2019-04-16 16:54:33 +08:00
先给个基本的数据结构吧,而且看你描述更像是更新操作而不是插入操作
|
4
aaa5838769 2019-04-16 17:11:28 +08:00
http://www.runoob.com/mongodb/mongodb-update.html 你看下有你解决的方案没。
|
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, } }, ] ) |
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.” |
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'},] |
8
brickyang 2019-04-16 21:38:12 +08:00
操作数组中 item 的 key 的方法是 array.$.field
文档: https://docs.mongodb.com/manual/reference/operator/update/positional/ |
9
brickyang 2019-04-16 21:39:55 +08:00
上面有人说的 upsert 是不对的。upsert 是针对「文档」的(如果查找的文档不存在则插入新文档)。
$ 操作符的文档中也说了不能同时使用 $ 和 upsert。 |
10
SlipStupig 2019-04-17 00:24:44 +08:00
@oblivious 这样会插入重复数据,好的方法是用$addToSet 操作符,参考 https://docs.mongodb.com/manual/reference/operator/update/addToSet/
|
11
SlipStupig 2019-04-17 00:26:46 +08:00
用 db.your_collection.update({"value": 50}, {$addToSet: {"value": 50}}}, {upsert: true}),这样就可以了
|
12
SlipStupig 2019-04-17 00:27:41 +08:00
这种时序任务 MongoDB 并不合适,influxdb 会更合适
|