Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js MongoDb查询:200万个DB查询或200个10000块查询。哪一个性能更好?_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js MongoDb查询:200万个DB查询或200个10000块查询。哪一个性能更好?

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模块 哪一个选项在

我需要一些关于mongodb数据库查询的建议

我的数据库中有200多万个数据。我想将这些记录与一个CSV文件进行比较,其中有200万条记录

所以我有两个选择:

  • 我从CSV中获得一条记录,并在数据库中搜索200万数据。在这种情况下,我在数据库中进行200万次查询

  • 第二个选择是,我可以进行200次查询。在每个查询中,我只能从DB中获取10000个数据块,并使用hashmap和loop(内存比较)将这些记录与CSV文件进行比较

  • 我正在使用node.js和mongoose.js npm模块

    哪一个选项在性能方面是好的

    例如:

    1)第一个场景:(SMS事务表,csv包含来自网关提供商的报告,我想将其与DB匹配)

    CSV包含以下数据:

    交易id、电话号码

    MongoDB文档包含以下数据:

    电话号码、交易id或组合字段(电话号码+“-”+交易id)

    **组合_字段是电话号码和交易_id的组合,以“-”(破折号)分隔

    结果我想要这样的结果:有多少来自CSV的记录在DB中不存在

    2)第二个场景(对于联系人表,用户正在从csv上传联系人)

    CSV包含以下数据:

    名字、姓氏、电子邮件、电话

    MongoDB数据包含以下数据:

    名字、姓氏、电子邮件=[{值:”xyz@mail.com,is_primary:true/false}],phone=[{value:“1234567890”,is_primary:true/false}]


    我想要的结果是这样的:联系人不在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数据的两个查询的响应时间:要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题与主题无关。如果您解释了您试图实现的目标,我很高兴在这里给出正确的答案。“我想比较”并没有说明比较的标准和目的——您是否需要两个集合中相同文档的列表、其中一个集合中不存在的文档列表、具有共同属性但不是完全副本的文档列表等?。请更新问题的细节。谢谢你的回答,我将测试你的代码,并在这里让你知道。非常感谢您抽出时间。