Node.js MongoDb查询:200万个DB查询或200个10000块查询。哪一个性能更好?
我需要一些关于mongodb数据库查询的建议 我的数据库中有200多万个数据。我想将这些记录与一个CSV文件进行比较,其中有200万条记录 所以我有两个选择:Node.js MongoDb查询:200万个DB查询或200个10000块查询。哪一个性能更好?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我需要一些关于mongodb数据库查询的建议 我的数据库中有200多万个数据。我想将这些记录与一个CSV文件进行比较,其中有200万条记录 所以我有两个选择: 我从CSV中获得一条记录,并在数据库中搜索200万数据。在这种情况下,我在数据库中进行200万次查询 第二个选择是,我可以进行200次查询。在每个查询中,我只能从DB中获取10000个数据块,并使用hashmap和loop(内存比较)将这些记录与CSV文件进行比较 我正在使用node.js和mongoose.js npm模块 哪一个选项在
我想要的结果是这样的:联系人不在DB中表示,然后准备obj并插入数据库。标题是一个典型的示例,因此答案是针对两个实际问题 1.数据库中不存在多少来自CSV的记录 用于将来自网关提供程序的数据加载到mongodb中的临时集合,然后使用聚合框架的阶段计算差异 例如:
- 集合X-基本集合
- 集合Y-导入的CSV中的临时集合
db.Y.aggregate([
{
$lookup:
{
from: "X",
let: { key: { $concat: [ "$phone_number", "-", "$transaction_id" ] } },
pipeline: [ { $match:{ $or:[
{ combined_field: "$$key"},
{ $expr: { $eq: [ "$$key", { $concat: [ "$phone_number", "-", "$transaction_id" ] } ] } }
] } } ],
as: "exist"
}
},
{ $match: { exist: { $size: 0 } } },
{ $group: { _id: null, cnt: {$sum: 1} } }
])
db.X.update(
{ first_name : csvDoc.first_name, last_name : csvDoc.last_name },
{
$addToSet: {
email: { value: csvDoc.email, is_primary: true/false },
phone : { value: csvDoc.phone, is_primary: true/false }
},
$setOnInsert: { first_name : csvDoc.first_name, last_name : csvDoc.last_name },
},
{ upsert: true }
)
返回问题中的数字
2.文档未在数据库中表示,请准备并插入数据库
解析CSV和所有文档
例如:
- 集合X-基本集合
- csvDoc—来自单个CSV行的javascritp文档
db.Y.aggregate([
{
$lookup:
{
from: "X",
let: { key: { $concat: [ "$phone_number", "-", "$transaction_id" ] } },
pipeline: [ { $match:{ $or:[
{ combined_field: "$$key"},
{ $expr: { $eq: [ "$$key", { $concat: [ "$phone_number", "-", "$transaction_id" ] } ] } }
] } } ],
as: "exist"
}
},
{ $match: { exist: { $size: 0 } } },
{ $group: { _id: null, cnt: {$sum: 1} } }
])
db.X.update(
{ first_name : csvDoc.first_name, last_name : csvDoc.last_name },
{
$addToSet: {
email: { value: csvDoc.email, is_primary: true/false },
phone : { value: csvDoc.phone, is_primary: true/false }
},
$setOnInsert: { first_name : csvDoc.first_name, last_name : csvDoc.last_name },
},
{ upsert: true }
)
如果没有具有给定名字和姓氏的文档,它将添加新文档,否则将向数组添加电子邮件和电话
通过在一个命令中批处理多达1000个文档,您可以使用来稍微加快速度。什么是“lac”?你想用汉语还是德语回答?那太糟糕了,对不起。检查更新的问题:pDefinitely选项2。第二个选项最好。查看1000数据1到1000和200到1000数据的两个查询的响应时间:要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题与主题无关。如果您解释了您试图实现的目标,我很高兴在这里给出正确的答案。“我想比较”并没有说明比较的标准和目的——您是否需要两个集合中相同文档的列表、其中一个集合中不存在的文档列表、具有共同属性但不是完全副本的文档列表等?。请更新问题的细节。谢谢你的回答,我将测试你的代码,并在这里让你知道。非常感谢您抽出时间。