Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在MongoDB中如何在对象级别进行匹配?_Arrays_Mongodb_Mongoose_Mongodb Query_Aggregation Framework - Fatal编程技术网

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] }
        }
      }
    }
  }
)