如何在Mongodb中的字段中查找子字符串

cod*_*ous 47 mongodb nosql

如何在数据库中找到对象字段包含子字符串的所有对象?

如果字段在具有字符串值的集合的对象中为A:

我想找到db"database"中的所有对象,其中A包含子字符串,说"abc def".

我试过了:

db.database.find({A: {$regex: '/^*(abc def)*$/''}})
Run Code Online (Sandbox Code Playgroud)

但没有奏效

UPDATE

一个真正的字符串(在unicode中):

Sujet  Commentaire sur  Star Wars  Episode III - La Revanche des Sith 1
Run Code Online (Sandbox Code Playgroud)

需要搜索星球大战的所有条目

db.test.find({A: {$regex: '^*(star wars)*$''}}) not wokring
Run Code Online (Sandbox Code Playgroud)

Der*_*ick 54

而不是这个:

db.database.find({A: {$regex: '/^*(abc def)*$/''}})
Run Code Online (Sandbox Code Playgroud)

你应该做这个:

db.database.find({A: /abc def/i })
Run Code Online (Sandbox Code Playgroud)

^*实际上不是有效的语法,因为^和$是锚点,而不是可重复的东西.你可能意味着^.*在这里.但是没有必要^.*因为它只是意味着"所有直到后面的字符"和(abc def)*意味着"0或更多次"abc def",但它必须在字符串的末尾,因为你的$.最后的"i"是让它不区分大小写.

  • 请注意,使用'^'有助于加速正则表达式查询,因为索引仅在此表单中有效(请参阅页面底部http://docs.mongodb.org/manual/reference/operator/regex/) (2认同)

小智 25

只需使用字符串"星球大战",其他人$regex将完成

db.test.find({A: {$regex: 'Star Wars'}})
Run Code Online (Sandbox Code Playgroud)

  • 不区分大小写:`db.test.find({A:{$ regex:'Star Wars',$ options:“ $ i”}})) (2认同)

小智 5

$regex 在大型集合上太昂贵/太慢。

我建议利用聚合框架和$indexOfCP

db.test.aggregate([{$match: 
    {$expr: { $gt: [{ $indexOfCP: [ "$A", "Star Wars" ] }, -1]}}
    }, {$project: {A:1}}])
Run Code Online (Sandbox Code Playgroud)

对于不区分大小写的搜索,您可以添加$toUpper到组合中并搜索STAR WARS.