MongoDB的一次奇妙查询

x33g5p2x  于6个月前 转载在 Go  
字(0.9k)|赞(0)|评价(0)|浏览(243)

这段时间遇到了一个业务需求,我有一些关于书籍的文档数据存储在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则不需要家这个条件,也不会报错。

总结

一定要让自己的开发环境和线上环境保持一致,这样才能保证功能代码一定正确实现和有效地执行。

相关文章