如何解决是否可以通过forEach返回与JavaScript函数中指定的条件相匹配的文档?
是否可以获取与JS函数内部条件匹配的文档,例如:
db.getCollection("persons").find({"dob.age":{$eq:70} } ).forEach(function(doc) {
if(doc.registered.age == doc.dob.age*2){ //or some other complicated conditions
return doc;
}
});
上面的代码不起作用,但是如果可以,我希望它返回registered.age
是其dob.age
两倍的所有文档。
有可能吗?
编辑:
根据评论中的建议,我已经使用map()对其进行了尝试,并且可以正常工作
人员集合:
{ "_id" : 1,"test1" : 95,"test2" : 92,"test3" : 90,"modified" : ISODate("2020-01-04T18:30:00Z") }
{ "_id" : 2,"test1" : 98,"test2" : 100,"test3" : 102,"modified" : ISODate("2020-01-04T18:30:00Z") }
{ "_id" : 3,"test2" : 110,"modified" : ISODate("2020-01-03T18:30:00Z") }
结果:
[
undefined,{
"_id" : 2,"modified" : ISODate("2020-01-04T18:30:00Z")
},undefined
]
我不明白的是为什么有两个未定义?
这种方法还利用索引吗?
解决方法
是的。简短答案:
db.getCollection("persons").find({"dob.age":{$eq:70} } ).filter(function(doc) {
return (doc.registered.age == doc.dob.age*2) //or some other complicated conditions
});
Array.forEach()
仅对数组的每个元素执行一次功能。它不返回任何内容,并且本身不执行任何操作来修改或过滤数组。
Array.map()
还会对数组的每个元素执行一次函数,但是每次调用该函数时,它都会使用函数的返回值来构建一个新数组,该数组具有与输入数组相同的元素数。
Array.filter()
与之类似:它对数组的每个元素执行一次函数,并构建一个新的数组,但是希望该函数返回true
或false
。如果函数返回true
,则它将输入数组中的该元素包含在要构建的新数组中。如果该函数返回false
,则它不将输入数组中的该元素包含在正在构建的新数组中。
获得undefined
的原因是您正在使用Array.map()
,它正在构建一个与输入数组具有相同数量的元素的新数组。编写您的函数,以便在条件为true时返回doc
,但在条件为false时不返回任何值(undefined
)。
Array.filter()
是您想要的。然后,应根据您是否希望将数组元素包含在输出中来使函数返回true
或false
。
旁注:我的意愿是将比较作为数据库查询的一部分,但是要回答您是否可以在JavaScript中本地进行比较的问题,可以。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。