【问题标题】:MongoDb Query returning unwanted documentsMongoDb 查询返回不需要的文档
【发布时间】:2018-11-08 19:20:18
【问题描述】:

我有一个包含两种结构文档的数据库:

{
  "name": "",
  "name_ar": "",
  "description": "",
  "bla1": {
    "name": "",
    "link": "",
    "Logo": ""
  },
  "bla2": {
    "name": "",
    "id": ""
  }
}

{
  "name": "",
  "name_ar": "",
  "description": "",
  "bla1": {
    "name": [],
    "link": "",
    "Logo": ""
  },
  "bla2": {
    "name": "",
    "id": ""
  }
}

我想查询我的集合以获取与“bla1.name”完全相同的文档。但是使用以下查询:

{$and: [{'bla1.name': {'$type': 'string'}}, {"bla1.name":'something'}]}

返回包含名称的所有文档(即使“bla1.name”是一个数组):'something'。

我做错了什么?

【问题讨论】:

  • 为什么要查看type?只需 db.collection.find({ "bla1.name": "something" }) 即可。
  • @AnthonyWinzlet 不能作为包含给定值的数组也被选中。
  • @AnthonyWinzlet 如果数组包含我正在寻找的名称则不起作用
  • @mbuechmann 哦,是的!我错了。

标签: mongodb mongodb-query


【解决方案1】:

来自 MongoDB 文档:

$type 现在可以像处理其他 BSON 类型一样处理数组。以前的版本只匹配字段包含嵌套数组的文档。

这意味着:如果一个数组至少有一个具有给定类型的元素,它将被选中。

如果您想排除数组作为类型,您必须扩展您的查询。由于查询已经匹配字符串,您可以排除字符串的类型选择:

$and: [
  // not necessary any more, as this selection is already implied by the last part
  // {
  //   "bla1.name": {
  //     "$type": "string"
  //   }
  // },
  {
    "bla1.name": {
      $not: {
        "$type": "array"
      }
    }
  }, {
    "bla1.name": "something"
  }
]

查看官方文档:https://docs.mongodb.com/manual/reference/operator/query/type/#behavior

这是 Mongo 操场上的工作演示:https://mongoplayground.net/p/3ri7Bjfrae8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2019-08-18
    • 2018-12-14
    相关资源
    最近更新 更多