我有一个包含大约40k个文档的集合,如下所示:
{
"_id":{"$oid":"5e988b703117c034b0630f8"},
"name":"London Heathrow Airport",
"country":"United Kingdom",
"iata":"LHR",
...
}我希望能够处理一个数组(实际上是一个Javascript,它可能有数百个元素),如下所示:
["LHR", "LGW", "BFS", ...]此数组中的项与文档上的iata属性相关。
我希望返回一个数组,其中返回集合中无法找到的元素,如果可以找到所有元素,则返回空值或空数组。例如,如果"LHR“和"LGW”匹配集合中文档的iata属性,但"BFS“不匹配,则应该返回"BFS”
我可以在数组中插入,对数组中的每一项进行单独的查询,但是如果输入数组有数百个元素,这似乎是非常低效率的。还有更好的办法吗?
谢谢
发布于 2020-12-24 19:49:31
您可以查询集合中是否匹配iata代码,并对结果和iata代码数组进行区分:
给定具有以下文档的集合airports:
{
"_id": 1,
"name":"London Heathrow Airport",
"country":"United Kingdom",
"iata":"LHR",
},
{
"_id": 2,
"name":"Ljubljana Airport",
"country":"Slovenia",
"iata":"LJU",
},给定下面的iata数组:
var iatas = ["LHR", "LJU", "BFS"];查找匹配的文档并以iata值数组的形式返回结果:
var result = [];
db.airports.find({
"iata": {
$in: iatas
}
}).toArray().map(
function(u) {
result.push(u.iata)
}
);结果如下:
//result
[
"LHR",
"LJU"
]现在您可以在result和iatas之间做一些区分
var nonexistentIatas = iatas.filter(x => !result.includes(x));nonExistentIatas的内容如下:
[
"BFS"
]https://stackoverflow.com/questions/65439061
复制相似问题