是否可以在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, "test1" : 95, "test2" : 110, "modified" : ISODate("2020-01-03T18:30:00Z") }
结果:
[
undefined,
{
"_id" : 2,
"test1" : 98,
"test2" : 100,
"test3" : 102,
"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
});
CCD_ 3只是对数组的每个元素执行一次函数。它不返回任何内容,而且它本身也不做任何修改或过滤数组的操作。
Array.map()
也会为数组的每个元素执行一次函数,但每次调用函数时,它都会使用函数的返回值来构建一个元素数与输入数组相同的新数组。
Array.filter()
类似:它为数组的每个元素执行一次函数,并构建一个新数组,但它希望函数返回true
或false
。如果函数返回true
,那么它将输入数组中的元素包含在它正在构建的新数组中。如果函数返回false
,则它不会将输入数组中的元素包含在正在构建的新数组中。
获得undefined
的原因是您使用的是Array.map()
,它正在构建一个与输入数组具有完全相同数量元素的新数组。编写函数时,如果条件为true,则返回doc
,但如果条件为false,则不返回任何内容(undefined
(。
Array.filter()
就是你想要的。您应该让函数返回true
或false
,这取决于您是否希望该数组元素包含在输出中。
附带说明:我倾向于将比较作为数据库查询的一部分进行,但为了回答您是否可以在JavaScript中本地进行比较的问题,是的,这是可以做到的。