如何在猫鼬中执行“每个”查询

时间:2020-03-29 06:31:15

标签: node.js mongodb mongoose

假设我有一个数据库,其中的文档字段包含以下内容

new Test({fruits: [ 'apple', 'orange', 'banana']})

我想通过另一个数组查询水果数组,确保传递给查询的数组包含水果数据库中的每个项目。

在普通JavaScript中,我将执行以下操作:

var target = [ 'apple', 'orange', 'banana'];

var fruit2 = [ 'apple', 'orange', 'banana', 'peach']; // true
var fruit3 = [ 'mango', 'lemon', 'pineapple']; // false
var fruit4 = [ 'banana', 'apple', 'orange']; // true

const result = target.every(targetElem => fruit2.includes(targetElem));
console.log(result);

我不能使用$in,因为它会遍历查询数组中的每个项目,以确保所有项目都存在。就我而言,我不介意查询的数组是否包含多余的项,只要它与数据库中的数组具有相同的项即可。

1 个答案:

答案 0 :(得分:0)

如果您使用的是MongodB 3.6版或更高版本,则可以将datatable(sdf, options=list(columnDefs = list(list(visible=FALSE, targets=c(2,3))))) #positions $expr$map$allElementsTrue一起使用,以根据每个文档评估数组的每个成员您的查询数组。

$in

这可能不是很有效。

Playground

修改

执行此操作的另一种方法,可以至少部分使用索引:

db.collection.find({
    $expr:{
        $allElementsTrue:{
            $map:{
                input: "$fruits",
                in: {$in: ["$$this", [ 'apple', 'orange', 'banana', 'peach']]}
            }
         }
    }
})