MongoDB的一次奇妙查询
这段时间遇到了一个业务需求,我有一些关于书籍的文档数据存储在MongoDB数据中,然后在修复数据之后,需要用一个查询去验证更新是否成功。
书籍数据大概长这个样子:
{
"books": [
{
"name": "UbuntuMeta",
"sku_id": "101",
"price": 30.5
},
{
"name": "freePHP",
"sku_id": "102",
"price": 75.5
}
],
"best_books": [
{
"name": "UbuntuMeta",
"sku_id": "101",
"price": 30.5
}
]
}
···
我想根据sku_id查询到在best_kooks里面元素但不再books里面的元素,根据思考我写出如下的查询语句:
···
$expr: {
$not: {
$setIsSubset: ['$best_books.sku_id', '$books.sku_id']
}
}
但是会出现如下报错:
Reason: error while multiplanner was selecting best plan :: caused by :: both operands of $setIsSubset must be arrays. First argument is of type: missing
这是因为best_books可能不存在或者不是array类型,所以需要增加一个条件:
{ $expr: { $eq: [{ $type: "$best_books" }, "array"] } },
mongodb 5.x之后才会有这个问题,我本地环境是4.x的mongodb则不需要家这个条件,也不会报错。
总结
一定要让自己的开发环境和线上环境保持一致,这样才能保证功能代码一定正确实现和有效地执行。
标签:
mongodb
, $setIsSubset
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通