Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
$elemmatch不在MongoDB中工作_Mongodb - Fatal编程技术网

$elemmatch不在MongoDB中工作

$elemmatch不在MongoDB中工作,mongodb,Mongodb,我试图在mongodb版本2.6.1中使用下面的查询来过滤mongo数据,但出现了错误 MongoDB版本2.4.6(工作): >db.BC_1839.find({data:{$elemMatch:{$where:{$this.First_name.toLowerCase().indexOf('kim')==0}}); 输出: { “_id”:ObjectId(“53719a9d5b9e5c8c110001b9”), “数据”:[ { “名字”:“金伯利”, “姓”:“韦曼”, “公司名称”:

我试图在mongodb版本2.6.1中使用下面的查询来过滤mongo数据,但出现了错误

MongoDB版本2.4.6(工作):

>db.BC_1839.find({data:{$elemMatch:{$where:{$this.First_name.toLowerCase().indexOf('kim')==0}});
输出:

{
“_id”:ObjectId(“53719a9d5b9e5c8c110001b9”),
“数据”:[
{
“名字”:“金伯利”,
“姓”:“韦曼”,
“公司名称”:“Scientific Agrcltl Svc Inc”,
“地址”:“哈里森街7721号”,
“城市”:“金斯威西部”,
“州”:“NS”,
“职位”:“2208”,
“电话1”:“02-7091-8948”,
“电话2”:“0441-151-810”,
“电子邮件”:kweyman@weyman.com.au",
“Web”:http://www.scientificagrcltlsvcinc.com.au", 
“活动”:“真实”
} 
], 
“历史”:[
{ 
“时间戳”:“2014-05-13 06:07:55”,
“事件”:“创建”,
“createdby”:“Srikesh Infotech”,
“创建数据”:[
{
“客户关系管理基础联系人id”:“1839”,
“crm\u导入的\u文件\u id”:“1464”
}  
] 
},
{
“时间戳”:“2014-05-13 06:09:05”,
“事件”:“任务”,
“createdby”:“Srikesh Infotech”,
“任务单元数据”:[
{
“活动ID”:“193”,
“Campagin名称”:“测试Campa1”
}
]
}
], 
“参考文献”:[
{“crm基础联系人id”:“1839”,“crm导入的文件id”:“1464”}
]
}
MongoDB版本2.6.1(不工作):

>db.BC_1839.find({data:{$elemMatch:{$where:{$this.First_name.toLowerCase().indexOf('kim')==0}});
输出:

错误:{
“$err”:“无法规范化查询:BadValue$elemMatch不能包含$
何处表达“,
“代码”:17287
}

相同的查询在mongodb版本2.4.6中执行,但在mongodb版本2.6.1中不执行。为什么?

它在早期版本中根本不应该工作,因为至少您已经修改了
的范围,现在将“数据”作为顶级元素引用。简而言之,这是不允许的,除非你必须这样做,否则你真的不应该使用JavaScript方法。即使如此,在大多数情况下,可能还有更好的方法

但事实上,这是一种不必要的JavaScript匹配用法,因为当存在其他操作符时,并不需要这样做

您应该改为使用表单:

db.docs.find({“data.First_name”:/^kim/i})
或字段内的任何位置,删除插入符号
^

db.docs.find({ "data.First_name": /kim/i })
这与JavaScript执行效率相当低,但没有通过解释器引擎处理的开销。当然,它在任何地方都有效

还要考虑一个依赖JavaScript解析的查询实际上在做什么:

  • 调用JavaScript解释器实例
  • 将每个文档的BSON文档类型转换为JavaScript类型
  • 在每个文档的解释器中计算JavaScript代码
  • 将JavaScript
    true | false
    作为每个文档的结果强制转换回

考虑到(但不区分大小写的匹配不是最佳匹配)正在执行相同的操作,但使用“pcre”C库本机使用,而无需对每个文档进行转换和重铸,那么这显然是两者中明智的选择。

它在早期版本中根本不应该工作,至少您已经修改了
的范围,现在将“数据”称为顶级元素。简而言之,这是不允许的,除非你必须这样做,否则你真的不应该使用JavaScript方法。即使如此,在大多数情况下,可能还有更好的方法

但事实上,这是一种不必要的JavaScript匹配用法,因为当存在其他操作符时,并不需要这样做

您应该改为使用表单:

db.docs.find({“data.First_name”:/^kim/i})
或字段内的任何位置,删除插入符号
^

db.docs.find({ "data.First_name": /kim/i })
这与JavaScript执行效率相当低,但没有通过解释器引擎处理的开销。当然,它在任何地方都有效

还要考虑一个依赖JavaScript解析的查询实际上在做什么:

  • 调用JavaScript解释器实例
  • 将每个文档的BSON文档类型转换为JavaScript类型
  • 在每个文档的解释器中计算JavaScript代码
  • 将JavaScript
    true | false
    作为每个文档的结果强制转换回

考虑到(但不区分大小写的匹配不是最佳匹配)正在执行相同的操作,但使用“pcre”C库本机使用,而无需对每个文档进行转换和重铸,那么这显然是两者中明智的选择。

它在早期版本中根本不应该工作,至少您已经修改了
的范围,现在将“数据”称为顶级元素。简而言之,这是不允许的,除非你必须这样做,否则你真的不应该使用JavaScript方法。即使如此,在大多数情况下,可能还有更好的方法

但事实上,这是一种不必要的JavaScript匹配用法,因为当存在其他操作符时,并不需要这样做

您应该改为使用表单:

db.docs.find({“data.First_name”:/^kim/i})
或字段内的任何位置,删除插入符号
^

db.docs.find({ "data.First_name": /kim/i })
这与JavaScript执行效率相当低,但没有通过解释器引擎处理的开销。当然,它对任何人都有效