在字段中搜索字符串或数字

时间:2017-06-12 11:45:46

标签: mongodb mongodb-query

我在MongoDB集合中有大约200,000个文档,我只需要获取具有特定内容的文档。

例如,

{
  "_id": ObjectID("593ddb4f02a8b0e23446ad65"),
  "instance_id": "166143",
  "json": {
    "o": {
      "2": [9]
    }
  }
}

我想在json.o.2中获取9个文件,但问题是,json.o.2可以是一个对象,它可以是一个字符串&也是一个整数,例如我想得到所有这些

"2": [9]
...
"2": 9
...
"2": "9"
...
"2": ["9"]

我尝试使用正则表达式,但它没有工作

 'json.o.2': { '$regex': /^(\[?)(.*)(,?)("?)9("?)(,?)(.*)(\]?)$/i } 

我还需要获取所有不包含特定号码的文档,我也使用正则表达式,但它也不起作用

'json.o.2': { '$regex': /^([?)([^3]*)(,?)("?)([^3]*)("?)(,?)([^3]*)(]?)$/i } 

2 个答案:

答案 0 :(得分:2)

然后使用$in查找两者:

db.collection.find({ "json.o.2": { "$in": ["9",9] } })

$in运算符基本上是$or

的简写形式
db.collection.find({ "$or": [{ "json.o.2": "9" }, { "json.o.2": 9 } ])

一般情况是实际搜索“或”值,因为你有一个完全匹配条件,那就完全没问题。 MongoDB也不关心路径是普通值还是数组。

答案 1 :(得分:2)

您可以在没有任何正则表达式的情况下轻松实现此目的,但使用 $or 运算符。

此查询应该完成工作:

db.collection.find({$or: [{"json.o.2": 9}, {"json.o.2": "9"}]}) 

在线试用:mongoplayground.net/p/6utj08SDWDU