Arrays 在MongoDB中如何在对象级别进行匹配?
输入文档Arrays 在MongoDB中如何在对象级别进行匹配?,arrays,mongodb,mongoose,mongodb-query,aggregation-framework,Arrays,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,输入文档 "data": { "abc": { "Id": "100" }, "xyz": { "Id": "123" } } 说明: 我想对数据执行$match。{I}I是参数,如果我将的“abc”作为参数 我得到以下输出,我想把多个参数传递给I“abc”,“xyz” 如何在dothat$中使
"data": {
"abc": {
"Id": "100"
},
"xyz": {
"Id": "123"
}
}
说明:
我想对数据执行$match
。{I}I是参数
,如果我将的“abc”作为参数
我得到以下输出,我想把多个参数传递给I
“abc”,“xyz”代码>
如何在dothat$中使用参数匹配对象键
预期产出:
"data": {
"abc": {
"Id": "100"
},
}
- 使用
$exists
- 投射出那把钥匙
第二个选项,如果数组中有键列表
- 映射到为
$或条件准备查询,并准备项目部分
第三个选项使用从MongoDb v4.4开始的项目操作符,采用更动态的方法
$objectToArray
将对象转换为数组
$filter
对转换后的数组进行筛选并获取匹配元素
$arrayToObject
将数组转换回对象
- 使用
$exists
- 投射出那把钥匙
第二个选项,如果数组中有键列表
- 映射到为
$或条件准备查询,并准备项目部分
第三个选项使用从MongoDb v4.4开始的项目操作符,采用更动态的方法
$objectToArray
将对象转换为数组
$filter
对转换后的数组进行筛选并获取匹配元素
$arrayToObject
将数组转换回对象
试试这个:
let key=[“abc”];
db.collectionName.aggregate([
{
$项目:{
“过滤数据”:{
$filter:{
输入:{$objectToArray:$data},
作为:“项目”,
条件:{
$in:[“$$item.k”,键]
}
}
}
}
},
{
$项目:{
数据:{$arrayToObject:$Filteredata}
}
}
]);
输出:当数组键=[“abc”]时代码>
{
“_id”:ObjectId(“60395e36e0c7d52970d3fa21”),
“数据”:{
“abc”:{
“Id”:“100”
}
}
}
输出:当数组键=[“abc”,“xyz”]时代码>
{
“_id”:ObjectId(“60395e36e0c7d52970d3fa21”),
“数据”:{
“abc”:{
“Id”:“100”
},
“xyz”:{
“Id”:“123”
}
}
}
试试这个:
let key=[“abc”];
db.collectionName.aggregate([
{
$项目:{
“过滤数据”:{
$filter:{
输入:{$objectToArray:$data},
作为:“项目”,
条件:{
$in:[“$$item.k”,键]
}
}
}
}
},
{
$项目:{
数据:{$arrayToObject:$Filteredata}
}
}
]);
输出:当数组键=[“abc”]时代码>
{
“_id”:ObjectId(“60395e36e0c7d52970d3fa21”),
“数据”:{
“abc”:{
“Id”:“100”
}
}
}
输出:当数组键=[“abc”,“xyz”]时代码>
{
“_id”:ObjectId(“60395e36e0c7d52970d3fa21”),
“数据”:{
“abc”:{
“Id”:“100”
},
“xyz”:{
“Id”:“123”
}
}
}
您可以添加输入示例和预期输出吗?输入示例是我将其作为输入文档放置的,预期输出是我针对参数放置的,如果您不了解问题,我们可以在聊天中讨论吗?您可以添加输入示例和预期输出吗?输入示例是我将其作为输入文档放置的,和预期输出,我把关于参数,如果你不明白的问题,我们可以讨论聊天吗?但是,我有一个键列表,我可以如何检查它,是“abc”在我的情况下将是一个参数?因为我需要给出需要匹配数组中可用键列表的列表值?它不是数组,但我可以将“数据”转换为“objectToArray”,然后我们有键,值,你明白我的意思了吗?是的,我明白你的意思,但它的繁重事务仅用于匹配和选择字段,我们可以做到这一点。我也将以这种方式与您分享。我是否可以使用聚合而不是模式。查找?但是,我有一个键列表,如何检查它,在我的情况下,“abc”是否是一个参数?因为我需要给出需要匹配数组中可用键列表的列表值?它不是数组,但我可以将“数据”转换为“objectToArray”,然后我们有键,值,你明白我的意思了吗?是的,我明白你的意思,但它的繁重事务仅用于匹配和选择字段,我们可以做到这一点。我也将以这种方式与您分享。我是否可以使用聚合而不是Schema.find?
let i = "abc";
Schema.find(
{ ["data."+i]: { $exists: true } },
{ ["data."+i]: 1 }
)
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);
let i = "abc";
Schema.find(
{ ["data."+i]: { $exists: true } },
{
data: {
$arrayToObject: {
$filter: {
input: { $objectToArray: "$data" },
cond: { $eq: ["$$this.k", i] }
}
}
}
}
)