javascript - 搜索重复键时检索重复结果?

标签 javascript mongodb

我的处境有点奇怪……我有一个包含重复项的键列表故意。为了参数的缘故,让我们假设这个列表看起来像 [1,2,3,2,1]。目前,用于获取属于这些 ID 的文档的代码循环遍历键列表,调用 findOne() 并将文档推送到一个数组中。

所以我们有这样的构造:

for (var i = 0; i < keys.length; i++) {
  documents.push(db.items.findOne(keys[i]);
}

我想知道是否有办法以更……优雅……的方式做到这一点,最好是使用单个查询?保持顺序将是一个加分项,但并非严格要求。

编辑: 请注意,这是一个 MongoDB 问题。我正在寻找一种方法,用一次调用 db.items.find() 来替代上述循环。

最佳答案

我认为没有直接的方法来检索重复键的列表,但既然你说过键是唯一的,你可以使用 $in 和一些循环来做到这一点:

var keys = [1,2,3,2,1];
var docHash = {}; //auxiliary hashtable containing mapping id -> document

var documents = []; //the result

db.items.find({id : {$in : keys}})
     .forEach(
         function(doc) {
             //if multiple documents can have the same key change it to:
             // if (docHash[doc.id]) { 
             //     docHash[doc.id].push(doc);
             // } else {
             //     docHash[doc.id] = [doc];
             // } 
             docHash[doc.id] = doc; 
         });

keys.forEach(function(i) {
     // if multiple documents can have the same key change it to:
     // docHash[i].forEach(function(item) {documents.push(item);});
     documents.push(docHash[i]);
}

请注意,虽然它比原来的要长,但它只查询数据库一次。作为奖励,它以与给定键相同的顺序返回文档。

关于javascript - 搜索重复键时检索重复结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11987434/

相关文章:

javascript - CSS根据angularjs条件变成某种颜色

javascript - 在具有特定前导字符和尾随字符的 javascript 字符上拆分

node.js - Mongo/Mongoose Invalid atomic update value 错误

javascript - MongoDB 更新对象

JavaScript 游戏只发射一束激光

javascript - 如何使用 ReactJs 设计像电子商务网站那样的通用过滤器?

javascript - 在自窗口中使用 JavaScript 打开 URL

node.js - Mongoose 高级自定义模式对象类型

MongoDB——在大型数据集上使用多个单词进行慢速文本搜索查询

python - 始终返回零文档的 Mongo 查询