如何在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
相关产品推荐
相关产品推荐

