javascript - 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 个产品
解决方案
您可以添加一些代码来操作查询结构,或者您必须使用聚合管道。
选项 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 })
推荐阅读
- python - 与 POST 数据相关的类型错误应该是字节
- javascript - 正则表达式匹配带有空格的短语
- react-native - 反应本机警报中的组件
- c# - 比较 2 个列表并提供更新数量的新列表
- r - 如何使用 ggplot2 为基因表达数据创建箱线图以及如何标准化给定数据?
- ibm-midrange - 如何在 RPGLE 中检索整数数组的 MAX 和 MIN 值
- vue.js - Bootstarp Vue - 表单标签 - 如何知道从列表中删除了哪个标签?
- kotlin - Kotlin:计算字符串中字符串的出现次数
- c# - 在 C# 中解析 C++ 程序集
- xamarin.forms - 未选中时复选框的值保持为真