【问题标题】:read values for a mongodb query from file从文件中读取 mongodb 查询的值
【发布时间】:2019-11-24 20:33:04
【问题描述】:

我正在尝试从 mongodb 集合中查询所有文档,其条件位于文件中。

标准文件.txt:

value1
value2
value3
...

目前我正在构建这样的查询

built-test.js.sh:

#!/bin/bash
echo 'db.collection.find({keyfield: {$in:[' > test.js
cat criteria-file.txt| while read i
do
    echo "\"$i\"," >> test.js
done
echo ']}})' >> test.js

查询文档的大小远低于 16MB,但我想知道是否有更好的方法更优雅、更高效,尤其是因为随着时间的推移,查询文档的大小很可能会超过 16MB。我渴望得到您的建议。

顺便说一句,我想知道,对于那些在当前有 2 亿个条目的集合中寻找的 25K 标准值,查询时间只有一分钟多一点,而且 CPU 负载似乎并不算太​​糟糕。

谢谢!

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    使用 cat() 本机 shell 方法将文件读入数组。然后,遍历标准值数组以找到匹配的文档并将所有文档存储在一个数组中;这将是您的匹配列表。

    var criteria_file = cat("criteria-file.txt");
    var criteria_array = criteria_file.split("\n");
    
    var result_ids_arr = [ ];
    
    for (let value of criteria_array) {
    
        let id_arr = db.collection.find( { keyfield: value }, { _id: 1} ).toArray();
        result_ids_arr = result_ids_arr.concat(id_arr);
    }
    

    _id 值的结果数组,例如:[ { "_id" : 11 }, { "_id" : 34 }, ... ]

    所有这些 JavaScript 都可以从命令提示符或 mongo shell 运行,使用 load()

    【讨论】:

    • 非常感谢,这正是我想要的。此外,这种方法将我的 25K 条件查询从超过一分钟减少到 35 秒。太好了!!
    • 我有另一个用例,其中包含 27 条 Millioin 记录的标准文件,然后 cat 说:2019-11-25T18:59:37.568+0100 E QUERY [js] Error: cat() : file to big to load as a variable : @(shell):1:8 ...我想现在 Joe Drumgoole 的答案会开始:分而治之。
    • Linux 可以选择以各种方式分割文件;块、大小、行数等。通过浏览我发现了这个:how to split large files。此外,您还可以对“使用超大文件进行编程”这一主题进行一些研究,以防需要经常运行该过程并实现自动化。
    【解决方案2】:

    将标准文件分成不同的块,确保块不超过 16MB。

    现在您可以并行运行查询,仅在每个块上运行相同的查询。

    如果您想获得更多花哨,可以使用聚合管道执行$match 查询,并使用$mergeenter link description here 将每个查询的所有输出结果发送到单个结果集合。

    【讨论】:

      猜你喜欢
      • 2016-06-09
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多