如何在数据库中找到对象字段包含子字符串的所有对象?
如果字段在具有字符串值的集合的对象中为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"是让它不区分大小写.
小智 25
只需使用字符串"星球大战",其他人$regex将完成
db.test.find({A: {$regex: 'Star Wars'}})
Run Code Online (Sandbox Code Playgroud)
小智 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.