【问题标题】:How to match on the object level in MongoDB?如何在 MongoDB 的对象级别上进行匹配?
【发布时间】:2021-05-26 16:20:37
【问题描述】:

输入文件

  "data": {
    "abc": {
      "Id": "100"

    },
    "xyz": {
      "Id": "123"
    }
}

解释: 如果我给"abc" as a parameter,我想在data.{i} i is parameter 上做$match 我得到以下输出,我想将多个参数传递给 i "abc", "xyz".. 我如何做到这一点,使用参数 $match 对象键。

预期输出

  "data": {
    "abc": {
      "Id": "100"
    },
}

【问题讨论】:

  • 你能添加一个输入示例和预期输出吗?
  • 输入示例是我把它作为输入文档,我把预期的输出放在参数上,如果你不明白问题可以在聊天中讨论吗?

标签: arrays mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:
  • 使用$exists检查密钥是否存在
  • 投射那把钥匙,
let i = "abc";
Schema.find(
  { ["data."+i]: { $exists: true } },
  { ["data."+i]: 1 }
)

Playground


第二个选项,如果你有数组中的键列表,

  • 映射通过为$or 条件准备查询,并准备项目部分
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);

Playground


从 MongoDb v4.4 开始使用项目运算符的第三个选项,采用更动态的方法,

  • $objectToArray 对象转数组
  • $filter 过滤转换后的数组并获取匹配的元素
  • $arrayToObject 将数组转换回对象
let i = "abc";
Schema.find(
  { ["data."+i]: { $exists: true } },
  {
    data: {
      $arrayToObject: {
        $filter: {
          input: { $objectToArray: "$data" },
          cond: { $eq: ["$$this.k", i] }
        }
      }
    }
  }
)

Playground

【讨论】:

  • 但是,我有一个键列表,我如何检查它,在我的情况下,“abc”是一个参数吗?因为我需要给出需要匹配的列表值
  • 数组中可用键的列表?
  • 它不是数组,但我可以将“data”转换为“objectToArray”,然后我们就有了键、值,你明白我的意思了吗?
  • 是的,我明白你的意思,但它的繁重事务仅用于匹配和选择字段,我们可以做到这一点。我也会以这种方式与您分享。
  • 我可以使用聚合而不是 Schema.find 吗?
【解决方案2】:

试试这个:

let keys = ["abc"];

db.collectionName.aggregate([
    {
        $project: {
            "filteredData": {
                $filter: {
                    input: { $objectToArray: "$data" },
                    as: "item",
                    cond: {
                        $in: ["$$item.k", keys]
                    }
                }
            }
        }
    },
    {
        $project: {
            data: { $arrayToObject: "$filteredData" }
        }
    }
]);

输出:当数组keys = ["abc"];

{
    "_id" : ObjectId("60395e36e0c7d52970d3fa21"),
    "data" : {
        "abc" : {
            "Id" : "100"
        }
    }
}

输出:当数组keys = ["abc", "xyz"];

{
    "_id" : ObjectId("60395e36e0c7d52970d3fa21"),
    "data" : {
        "abc" : {
            "Id" : "100"
        },
        "xyz" : {
            "Id" : "123"
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    相关资源
    最近更新 更多