如何使$ where和RegExp.prototype.test()工作

时间:2014-05-12 08:50:07

标签: mongodb mongodb-query

我在mongodb中有这两个命令:

1.- db.tag.find({$where:"'star wars episode VII'.search(this.name) >= 0"})
2.- db.tag.find({$where: "/this.name/.test('star wars episode VII')"})

以及下面的集合:

db.tag.find()
{ "_id" : ObjectId("536f7107c55b2acc61000bc8"), "name" : "star" }
{ "_id" : ObjectId("536f710fc55b2acc61000bc9"), "name" : "star wars" }
{ "_id" : ObjectId("536f7117c55b2acc61000bca"), "name" : "spider" }
{ "_id" : ObjectId("537087d16ac5b5f6f58f0b1b"), "name" : "starting" }

问题:

为什么选项1返回我需要的数据但选项2没有提供任何输出?选项2有什么问题?

e.g。

db.tag.find({$where:"'star wars episode VII'.search(this.name) >= 0"})
{ "_id" : ObjectId("536f7107c55b2acc61000bc8"), "name" : "star" }
{ "_id" : ObjectId("536f710fc55b2acc61000bc9"), "name" : "star wars" }

非常感谢

Neil Lunn

解决方案

2.- db.tag.find(function(){ var patt = new RegExp(this.name); return patt.test("star wars episode VII"); })

2 个答案:

答案 0 :(得分:1)

对你来说,最好的试金石可能就是使用JavaScript REPL,就像你的基本原则mongo shell一样:

var string = "star wars episode VII";
/string/.test("star wars episode VII - a new disney");

当然只会返回false

这里的一般问题是你不能在正则表达式的/../语法中使用变量,为此你实际上需要将它定义为RegExp对象,如下所示:

var patt = new RegExp("star wars episode VII");
patt.test("star wars episode VII - a new disney");

所以这两个语句实际上并不相等,因此一个返回true而另一个返回false。

对于JavaScript执行而言,这是真的(尽管同样可怕),你根本不需要这个,并且可以简单地进行Regex搜索:

db.tag.find({ "name": /star wars episode VII/ })

MongoDB支持这一点,但它确实不建议,但要么使用$where运算符。有关详细信息,请参阅$regex

答案 1 :(得分:0)

在你的第二个问题中,你不应该反过来吗?

db.tag.find({$where: "/star wars episode VII/.test(this.name)"})

另一方面,我会建议这些表达式,如果没有$ where子句,它将完全相同:

db.tag.find({ name: /star wars episode VII/ });

db.tag.find({ name: { $regex: {"star wars episode VII"} } );