我有以下一组测试文档,我插入到mongodb中,当我使用$ where查询数据库获取以下异常时
错误:数据库错误:$ where where query,但没有脚本引擎
任何想法为什么$ where子句不起作用
测试数据:
db.things.save({ "_id" : 1, "domainName" : "test11.com", "hosting" : "hostgator.com" })
db.things.save({ "_id" : 2, "domainName" : "test2.com", "hosting" : "aws.amazon.com"})
db.things.save({ "_id" : 3, "domainName" : "test3.com", "hosting" : "aws.amazon.com" })
db.things.save({ "_id" : 4, "domainName" : "test4.com", "hosting" : "hostgator.com" })
db.things.save({ "_id" : 5, "domainName" : "test5.com", "hosting" : "aws.amazon.com" })
db.things.save({ "_id" : 6, "domainName" : "test6.com", "hosting" : "cloud.google.com" })
db.things.save({ "_id" : 7, "domainName" : "test7.com", "hosting" : "aws.amazon.com" })
db.things.save({ "_id" : 8, "domainName" : "test8.com", "hosting" : "hostgator.com" })
db.things.save({ "_id" : 9, "domainName" : "test9.com", "hosting" : "cloud.google.com" })
db.things.save({ "_id" : 10, "domainName" : "test10.com", "hosting" : "godaddy.com" })
使用的查询:
db.things.find({$ where:“this.domainName =='test11.com'”});
答案 0 :(得分:0)
除非您绝对需要,否则请不要使用$where
运营商。然后请不要使用$where
运算符。
有一种更好的方法:
db.things.find({ "domainName": "test11.com" })
这是标准查询表单。你几乎不应该使用$where
,如果你认为你这样做,那么请在这里发布你的问题,这样我们就可以让你直截了当。
即:
$where
进行JavaScript比较,这意味着会生成一个解释器实例来评估条件。毫无疑问,这比其他情况下的本机代码评估更慢。
$where
如文档所述,由于转换和转移到Interpreter实例,因此抛弃了针对索引测试条件评估的能力。所以这又是非常对性能不利。
几乎始终本机实现将由本机代码接口支持,这将实现更好和更快可以通过调用JavaScript解释器来实现。如果它现在不存在,那么它将来会有效。
这里的总体观点是,您的查询形式不是必需的,因为它是MongoDB已经以本机方式执行的操作。
此外,由于您似乎指的是“在线测试shell”,因此如果没有在API中另外实现,则会调用mongod
进程可用的禁用JavaScript执行的选项。正在处理客户转移。
最后一点是有意义的,以避免可能的黑客利用攻击,但MongoDB通常(在最新版本中)非常安全,因为这样的脚本注入“可以”通过允许在开放环境可用的参数中指定JavaScript来实现
答案 1 :(得分:0)
错误可能即将发生,因为在mongodb服务器上,可能已禁用了服务器端的JavaScript执行,要检查这是否使用sh.status()。
除非绝对必要,否则不应使用“$ where”查询:它们要慢得多 比常规查询。
同时检查这些链接“where”子句如何用于NoSQL注入。