请教一个 mongodb 插入操作

2019-04-16 15:58:28 +08:00
 kidlfy

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

2027 次点击
所在节点    Python
12 条回复
muxiesan1989
2019-04-16 16:13:05 +08:00
可以试试 db.update({ key: item }, item, True)
luanguang
2019-04-16 16:23:18 +08:00
试试 update_many()方法?找到符合条件的然后更新,没有就直接插入。
Orenoid
2019-04-16 16:54:33 +08:00
先给个基本的数据结构吧,而且看你描述更像是更新操作而不是插入操作
aaa5838769
2019-04-16 17:11:28 +08:00
http://www.runoob.com/mongodb/mongodb-update.html 你看下有你解决的方案没。
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
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
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
2019-04-16 21:38:12 +08:00
操作数组中 item 的 key 的方法是 array.$.field

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

$ 操作符的文档中也说了不能同时使用 $ 和 upsert。
SlipStupig
2019-04-17 00:24:44 +08:00
@oblivious 这样会插入重复数据,好的方法是用$addToSet 操作符,参考 https://docs.mongodb.com/manual/reference/operator/update/addToSet/
SlipStupig
2019-04-17 00:26:46 +08:00
用 db.your_collection.update({"value": 50}, {$addToSet: {"value": 50}}}, {upsert: true}),这样就可以了
SlipStupig
2019-04-17 00:27:41 +08:00
这种时序任务 MongoDB 并不合适,influxdb 会更合适

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/555725

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX