gpt4 book ai didi

ruby - 我如何找出实际插入了多少 Mongo 文档?

转载 作者:可可西里 更新时间:2023-11-01 09:58:00 25 4
gpt4 key购买 nike

我有一个看起来像这样的函数:

def insert_multiple_cakes(cake_list)
ensure_indexes

insert_list = cake_list.map { |cake| mongofy_values(cake.to_hash) }

inserted = db[CAKE_COLLECTION].insert(insert_list, w: 0)

return inserted.length
end

该函数的目标是将cake_list 中的所有蛋糕插入到Mongo 数据库中。任何已经存在于数据库中的蛋糕都应该被忽略。该函数应返回插入的蛋糕数,因此如果 cake_list 包含 5 个蛋糕并且其中 2 个蛋糕已存在于数据库中,则该函数应返回 3。

我的问题是,经过一个小时的试验,我得出以下结论:

  • 如果写关注(:w 选项)为 0,则插入调用静默忽略所有重复插入,返回值包含所有输入文件,甚至那些没有插入的文件。无论我设置什么 :continue_on_error:collect_on_error,返回值总是包含所有文档,以及收集到的错误列表总是空的。

  • 如果 write concern 为 1,则如果输入文档中存在任何重复项,插入调用将失败并返回 Mongo::OperationFailure。无论我将 :continue_on_error:collect_on_error 设置为什么,当存在重复时插入总是失败。

所以在我看来,实现这一目标的唯一方法是遍历输入列表,对每个文档执行搜索并过滤掉那些已经存在的文档。我的应用程序将一次处理(至少)数千个插入,所以我喜欢这个计划就像我想跳下一座桥一样。

我是不是误解了什么,或者 Ruby 客户端可能有问题?


为了演示,这个函数完全按照我的意愿工作:

def insert_multiple_cakes(cake_list)
ensure_indexes

collection = db[CAKE_COLLECTION]

# Filters away any cakes that already exists in the database.
filtered_list = cake_list.reject { |cake|
collection.count(query: {"name" => cake.name}) == 1
}

insert_list = filtered_list.map { |cake| mongofy_values(cake.to_hash) }

inserted = collection.insert(insert_list)

return inserted.length
end

问题是它执行了无数次搜索,而实际上它只需要执行一次插入。


Documentation for Mongo::Collection#insert

最佳答案

你可以这样做(source):

coll = MongoClient.new().db('test').collection('cakes')
bulk = coll.initialize_unordered_bulk_op
bulk.insert({'_id' => "strawberry"})
bulk.insert({'_id' => "strawberry"}) # duplicate key
bulk.insert({'_id' => "chocolate"})
bulk.insert({'_id' => "chocolate"}) # duplicate key
begin
bulk.execute({:w => 1}) # this is the default but don't change it to 0 or you won't get the errors
rescue => ex
p ex
p ex.result
end

ex.result 包含 ninserted 以及每个失败的原因。

{"ok"=>1,
"n"=>2,
"code"=>65,
"errmsg"=>"batch item errors occurred",
"nInserted"=>2,
"writeErrors"=>
[{"index"=>1,
"code"=>11000,
"errmsg"=>
"insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.cakes.$_id_ dup key: { : \"strawberry\" }"},
{"index"=>3,
"code"=>11000,
"errmsg"=>
"insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.cakes.$_id_ dup key: { : \"chocolate\" }"}]}

关于ruby - 我如何找出实际插入了多少 Mongo 文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26775809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com