如何在 MongoDB 中的对象级别进行匹配? [英] How to match on the object level in MongoDB?

查看:18
本文介绍了如何在 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆