我正在使用
我有以下场景:
1. 对于集合
MongoDB的一般准则是在应用程序代码中处理跨集合操作。
所以我做如下操作:
这个方法是可行的,但完成这项工作需要很长时间 - 在集合
有没有更快的方法来完成此操作?我现在使用的方法是否正确? 示例文档
mongo
gem在Ruby中使用MongoDB。我有以下场景:
1. 对于集合
coll1
中的每个文档,查看key1
和key2
2. 在另一个集合coll2
中搜索具有与key1
和key2
匹配值的文档
3. 如果有匹配项,则将#2中获取的文档添加到一个新键key3
中,其值设置为#1中引用的文档中key3
的值
4. 将更新后的哈希插入到一个新集合coll3
中MongoDB的一般准则是在应用程序代码中处理跨集合操作。
所以我做如下操作:
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => some_db,
:server_selection_timeout => 5)
cursor = client[:coll1].find({}, { :projection => {:_id => 0} }) # exclude _id
cursor.each do |doc|
doc_coll2 = client[:coll2].find('$and' => [{:key1 => doc[:key1]}, {:key2 => doc[:key2] }]).limit(1).first # no find_one method
if(doc_coll2 && doc[:key3])
doc_coll2[:key3] = doc[:key3]
doc_coll2.delete(:_id) # remove key :_id
client[:coll3].insert_one(doc_coll2)
end
end
这个方法是可行的,但完成这项工作需要很长时间 - 在集合
coll1
中每个文档大约需要250毫秒,或者对于大约15000条记录需要3600秒(1小时),这似乎很多,可能与逐个读取文档,进行应用程序代码检查,然后逐个将文档写回新集合有关。有没有更快的方法来完成此操作?我现在使用的方法是否正确? 示例文档
coll1
{ "_id" : ObjectId("588610ead0ae360cb815e55f"), "key1" : "115384042", "key2" : "276209", "key3" : "10101122317876" }
coll2
{ "_id" : ObjectId("788610ead0ae360def15e88e"), "key1" : "115384042", "key2" : "276209", "key4" : 10, "key5" : 4, "key6" : 0, "key7" : "false", "key8" : 0, "key9" : "false" }
coll3
{ "_id" : ObjectId("788610ead0ae360def15e88e"), "key1" : "115384042", "key2" : "276209", "key3" : "10101122317876", "key4" : 10, "key5" : 4, "key6" : 0, "key7" : "false", "key8" : 0, "key9" : "false" }