首页 > 解决方案 > Mongo 数组查询计数

问题描述

样品采集

[
 {
  products: [
   {name: 'apple'}, {name: 'mango'}, {name: 'orange'}
  ]
},
 {
  products: [
   {name: 'banna'}, {name: 'grapes'}, {name: 'orange'}
  ]
}
]

我想要查询以了解哪个文档是否包含我搜索的至少 2 个产品

例如..

collection.find({ products: {$in: ['apple', 'mango', 'durian', 'avocado', 'orange']} })

但这仅检查它是否包含其中一种产品。我想知道某些文件是否包含我正在搜索的至少 2 个产品

标签: javascriptmongodb

解决方案


您可以添加一些代码来操作查询结构,或者您必须使用聚合管道。

选项 1(推荐),将聚合管道与$filter一起使用:

let fruits = ['apple', 'mango', 'durian', 'avocado', 'orange'];
collection.aggregate([
    {
        $match: {
            "products.name": {$in: fruits}
        }
    },
    {
        $project: {
            good_products_size: {
                $size: {
                    $filter: {
                        input: "$products",
                        as: "product",
                        cond: {$in: ["$$product.name", fruits]}
                    }
                }
            }
        }
    },
    {
        $match: {
            good_products_size: {$gt: 1}
        }
    }
]);

选项 2(不太推荐 imo),从 fruits 数组中生成所有可能的对并使用$all

let fruits = ['apple', 'mango', 'durian', 'avocado', 'orange'];
let queryOrConds = [];

for (let i = 0; i < fruits.length - 1; i++) {
    for (let j = i; j < fruits.length - 1; j++) {
        queryOrConds.push({"products.name": {$all: [fruits[i], fruits[j]]}})
    }
}
collection.find({ $or: queryOrConds })

推荐阅读