67

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

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

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

我试过:

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

但没有用

更新

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

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

需要用 Star Wars 搜索所有条目

db.test.find({A: {$regex: '^*(star wars)*$''}}) not wokring
4

6 回答 6

72

而不是这个:

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

你应该做这个:

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

^* 实际上不是有效的语法,因为 ^ 和 $ 是锚点,而不是可重复的东西。你可能是指 ^.* 这里。但是不需要 ^.* 因为这只是表示“直到后面的字符的所有内容”并且 (abc def)* 表示“0 次或多次“abc def”,但它必须位于字符串的末尾,因为你的 $. 最后的“i”是为了使它不区分大小写。

于 2012-04-20T10:01:30.937 回答
44

只需使用字符串“Star Wars”,$regex剩下的就做

db.test.find({A: {$regex: 'Star Wars'}})
于 2015-02-06T16:53:53.610 回答
8

$regex在大型收藏中太贵/太慢了。

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

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

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

于 2019-06-28T14:38:43.853 回答
3

这对我有用:

db.test.find({"A": {'$regex': '.*star wars.*'}})
于 2020-03-11T06:44:36.520 回答
0
// 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();
于 2020-12-12T15:52:01.360 回答
0

这个使用聚合语法:

db.movies.aggregate([
  {$match: 
    {
      title: {$regex: 'Star'}
    } 
  }
] )
于 2021-04-13T06:30:58.240 回答