You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MongoDB Compass中查询status对象含INACTIVE值的文档

问题描述

我的数据存储格式如下:

"status": {
"634feb9a5723003699a87e1e": "ACTIVE",
"634ff0b95723003699a88054": "ACTIVE"
}

其中status是一个对象,其键为MongoDB ObjectId。我需要查找所有status对象的任意子项值为"INACTIVE"的文档。

我曾尝试在MongoDB Compass中使用正则查询:

{status:/"INACTIVE"/i}

但该方法仅适用于字符串数组,请问针对对象应如何实现此查询?

解决方案

针对这种键不固定的对象结构,可通过以下两种方式实现查询:

方案1:聚合查询

通过$objectToArray将对象转为键值对数组,再筛选包含目标值的文档:

db.collection.aggregate([
  {
    $match: {
      $expr: {
        $in: ["INACTIVE", { $map: { input: { $objectToArray: "$status" }, as: "item", in: "$$item.v" } }]
      }
    }
  }
])
  • $objectToArray: "$status":将status对象转换为[{k: "ObjectId值", v: "状态"}]格式的数组
  • $map:提取数组中所有状态值,生成新数组
  • $in:判断"INACTIVE"是否存在于新数组中,存在则匹配该文档

方案2:find查询结合$expr

用$anyElementTrue判断是否存在符合条件的状态值:

db.collection.find({
  $expr: {
    $anyElementTrue: {
      $map: {
        input: { $objectToArray: "$status" },
        as: "item",
        in: { $eq: ["$$item.v", "INACTIVE"] }
      }
    }
  }
})
  • $map遍历转换后的数组,逐个判断状态值是否等于"INACTIVE",返回布尔值数组
  • $anyElementTrue检查布尔数组中是否存在true,存在则匹配该文档

在MongoDB Compass中使用

直接将上述查询语句复制到对应标签页的输入框:

  • 方案1对应Aggregation标签
  • 方案2对应Find标签

内容的提问来源于stack exchange,提问作者Saad UR Rehman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 13:05:08