我的处境有点奇怪……我有一个包含重复项的键列表故意。为了参数的缘故,让我们假设这个列表看起来像 [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/