MongoDb查询返回不需要的文档

时间:2018-11-08 10:36:52

标签: mongodb mongodb-query

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

{
  "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'}]}

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

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

来自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

以下是蒙哥游乐场的工作演示:https://mongoplayground.net/p/3ri7Bjfrae8