【问题标题】:MongoDb query: 2 milion query in DB OR 200 query in chunks of 10000. Which one is better for performance?MongoDb 查询:DB 中的 200 万个查询或 10000 个块中的 200 个查询。哪一个对性能更好?
【发布时间】:2018-07-19 20:52:03
【问题描述】:

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

我的数据库中有超过 200 万条数据。我想将这些记录与一个包含 200 万条记录的 CSV 文件进行比较。

所以我有两个选择:

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

  2. 第二个选项是,我可以进行 200 次查询。在每个查询中,我只能从 DB 中带入 10000 个数据块,并使用 hashmap 和循环将这些记录与 CSV 文件进行比较(在内存比较中)。

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

哪个选项性能好?

例如:

1) 第一种情况:(短信交易表,csv 包含来自网关提供商的报告,我想将其与 DB 匹配)

CSV 包含以下数据:

transaction_id, phone_number

MongoDB 文档包含以下数据:

phone_number、transaction_id 或 combine_field(phone_number+"-"+transaction_id)

**combined_field 是 phone_number 和 transaction_id 的组合,由“-”(破折号)分隔。

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

2) 第二种情况(对于联系人表,用户正在从 csv 上传联系人)

CSV 包含以下数据

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

MongoDB 数据包含以下数据:

first_name, last_name, email = [{value: "xyz@mail.com", is_primary: true/false}], phone = [{value: "1234567890", is_primary: true/false}]

我想要的结果是这样的: 联系人没有在 DB 中表示,然后准备 obj 并插入到数据库中。

【问题讨论】:

  • 什么是“lac”?你想用普通话还是德语回答你的问题;)?
  • 那很抱歉。检查更新的问题:p
  • 绝对是选项 2。
  • 第二个选项是最好的。查看 1000 数据 1 到 1000 和 200 到 1000 数据的两个查询的响应时间
  • stackoverflow.com/help/on-topic: 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题是题外话 我很乐意提供如果您解释您要达到的目标,这里有一个正确的答案。 “我想比较”既没有说明标准也没有说明比较的目的——你是否需要两个集合中相同文档的列表,其中一个集合中不存在的文档列表,具有共同属性但不是精确副本等的文档列表?请更新问题的详细信息。

标签: node.js mongodb mongoose


【解决方案1】:

标题是XY-problem的典型例子,所以回答2个实际问题。

1。有多少来自 CSV 的记录在 DB 中不存在

当数据来自网关提供者时,使用mongoimport将数据加载到mongodb中的临时集合,然后使用聚合框架的$lookup阶段计算差异。

例子:

  • 集合 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} } }
])

返回问题中的数字。

2。文档未在数据库中表示,然后准备并插入数据库中

解析 CSV 和 upsert 所有文档。

例子:

  • 集合 X - 基础集合
  • csvDoc - 来自单个 CSV 行的 javascritp 文档

查询:

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 } 
)

如果给定的 first_name 和 last_name 没有任何内容,它将添加新文档,否则将电子邮件和电话添加到数组中。

您可以使用bulk writes 通过在单个命令中批处理多达 1000 个文档来加快速度。

【讨论】:

  • 感谢您的回答,我将测试您的代码并在此处通知您。非常感谢您的宝贵时间。
猜你喜欢
  • 2011-11-24
  • 2019-05-06
  • 2016-09-19
  • 1970-01-01
  • 2011-12-16
  • 2015-03-14
  • 1970-01-01
相关资源
最近更新 更多