Mongodb - $ Text返回文档中所有单词的文档

时间:2017-11-30 17:32:15

标签: mongodb mongodb-query

这是我的mongodb中的数据

db.test.insert([
 { "modelo" : "S10 P-Up Executive 2.4 MPFI F.Power CD" },
 { "modelo" : "SANDERO STEPWAY Hi-Power 1.6 8V 5p" },
 { "modelo" : "Gol (novo) 1.6 Power/Highi T.Flex 8v 4P" }
 ])

此文档有一个文本索引。

db.test.createIndex( { modelo: "text" } )

此查询带来了所有数据,这是正确的。     db.test.find({$ text:{$ search:" Gol power"}})

但是,我想知道是否有办法将两个单词都放在里面的文件。对于此示例,而不是返回all,它将只返回一个:

   { "modelo" : "Gol (novo) 1.6 Power/Highi T.Flex 8v 4P" }

我试图用聚合而不是find来做。但是我没有成功。 有什么建议怎么做?

1 个答案:

答案 0 :(得分:1)

  

方法1:

$ search中给出的默认值将被视为OR运算符,这就是您获取所有记录的原因,我们需要提供如下所示的查询以使$ search为AND运算符取得给定的单词

db.test.find( { $text: { $search: "\"Gol\" power" } } )

结果是

{ "_id" : ObjectId("5a20fa66bf339f14930eb0ae"), "modelo" : "Gol (novo) 1.6 Power/Highi T.Flex 8v 4P" }

如果$ search字符串包含短语和单个术语,则文本搜索将仅匹配包含该短语的文档。更具体地,搜索执行短语与搜索字符串中的各个词的逻辑AND。请参阅$text

  

方法2:

或者,我们可以使用$regex以其他方式实现它。它的速度要慢得多,因为它可以完全收集扫描,但它可以提供更大的灵活性,例如:考虑到单词的顺序。

检索所需结果的示例查询,其中Gol严格出现在power之前:

db.test.find({modelo:{$regex: /Gol.*power/, $options: "si"}});

结果是

{ "_id" : ObjectId("5a20fa66bf339f14930eb0ae"), "modelo" : "Gol (novo) 1.6 Power/Highi T.Flex 8v 4P" }

db.test.find({$ text:{$ search:“Gol power”}})带来所有数据的原因是带有OR条件的单词。