如何在 MongoDB 中的对象级别进行匹配? [英] How to match on the object level in MongoDB?
本文介绍了如何在 MongoDB 中的对象级别进行匹配?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
输入文档
"data": {
"abc": {
"Id": "100"
},
"xyz": {
"Id": "123"
}
}
说明:我想在 data.{i} i 是参数
上做 $match
如果我给 "abc"作为参数
我得到以下输出,我想将多个参数传递给 i
"abc", "xyz" ...
我如何做到这一点,使用参数 $match 对象键.
Explanation :
I want to do the $match
on data.{i} i is parameter
if I give to "abc" as a parameter
I get the following output, I want to pass the multiple parameters to i
"abc", "xyz"..
How I can do that in do that $match the object key using parameter.
预期输出:
"data": {
"abc": {
"Id": "100"
},
}
推荐答案
- 使用
$exists
检查密钥是否存在 - 投射那个键,
let i = "abc";
Schema.find(
{ ["data."+i]: { $exists: true } },
{ ["data."+i]: 1 }
)
第二个选项,如果你有数组中的键列表,
Second option if you have list of keys in array,
- 映射通过为
$或
条件准备查询,并准备项目部分
- map through prepare a query for
$or
condition, and prepare project part
let i = ["abc", "xyz"];
let query = [], project = {};
i.map(k => {
query.push({ ["data."+k]: { $exists: true } });
project["data."+k] = 1;
});
Schema.find({ $or: query }, project);
从 MongoDb v4.4 开始使用项目操作符的第三个选项,采用更动态的方法,
Third option using project operators starting from MongoDb v4.4, with more dynamic approach,
$objectToArray
将对象转换为数组$filter
过滤上面转换后的数组并获取匹配的元素$arrayToObject
将数组转回对象
$objectToArray
convert object to array$filter
to filter above converted array and get matching elements$arrayToObject
convert array back to object
let i = "abc";
Schema.find(
{ ["data."+i]: { $exists: true } },
{
data: {
$arrayToObject: {
$filter: {
input: { $objectToArray: "$data" },
cond: { $eq: ["$$this.k", i] }
}
}
}
}
)
这篇关于如何在 MongoDB 中的对象级别进行匹配?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文