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

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

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

我想找到数据库中的所有对象,其中 A 包含一个子字符串,表示“ abc def”。

我试过:

db.database.find({A: {$regex: '/^*(abc def)*$/''}})

但没成功

更新

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

Sujet  Commentaire sur  Star Wars  Episode III - La Revanche des Sith 1

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

db.test.find({A: {$regex: '^*(star wars)*$''}}) not wokring
102222 次浏览

而不是这样:

db.database.find({A: {$regex: '/^*(abc def)*$/''}})

你应该这样做:

db.database.find({A: /abc def/i })

^ * 实际上不是有效的语法,因为 ^ 和 $是锚点,而且不是可重复的。你的意思可能是 ^ 。* here.但是没有必要 ^ 。* 就是简单地表示“ Everything up to the string following”,(abc def) * 表示“0或更多次“ abc def”,但它必须在字符串的末尾,因为 $。最后的“ i”是为了让它不区分大小写。

只要使用字符串“星球大战”和 $regex将做其余的

db.test.find({A: {$regex: 'Star Wars'}})

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

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

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

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

这对我很有效:

db.test.find({"A": {'$regex': '.*star wars.*'}})
// executes, name LIKE john and only selecting the "name" and "friends" fields
db.collection.find({ name: /john/i }, 'name friends').exec();


// passing options
db.collection.find({ name: /john/i }, null, { skip: 10 }).exec();

这个使用聚合语法:

db.movies.aggregate([
{$match:
{
title: {$regex: 'Star'}
}
}
] )