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

查看:64
本文介绍了如何在MongoDB中的对象级别进行匹配?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

输入文档

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

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

说明:我想对数据进行 $ match .{i}如果给"abc",则我是参数.作为参数我得到以下输出,我想将多个参数传递给 i "abc","xyz" .. 我该怎么做,用参数$匹配对象键.

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,

    • 通过映射为 $ or 条件准备查询,并准备项目部分
    • 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天全站免登陆