php-使用部分_id字符串查找mongodb文档
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php-使用部分_id字符串查找mongodb文档,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3880字,纯文字阅读大概需要6分钟。
内容图文
![php-使用部分_id字符串查找mongodb文档](/upload/InfoBanner/zyjiaocheng/885/e376169763364df095921cf8024863a3.jpg)
我需要在一个集合中找到一个或多个在其_id字段中具有特定字符串的文档.
这被证明是一个问题,因为_id字段是一个对象而不是字符串,所以我不能只对其进行正则表达式.
例如,假设我有带有这些_id的这些文档:
54060b811e8e813c55000058
54060e9e1e8e813c55000059
540738e082fa085e5f000015
我想搜索“ 00005”,那么结果应该是
54060b811e8e813c55000058
54060e9e1e8e813c55000059
反正有做到这一点吗?
我需要一个jquery数据表实现,它使用PHP的服务器端处理.
这意味着我需要在代码的这一部分中添加一些内容:
if ( !empty($input['sSearch']) ) {
$sSearch = $input['sSearch'];
for ( $i=0 ; $i < $iColumns ; $i++ ) {
if ($input['bSearchable_'.$i] == 'true') {
if ($input['bRegex'] == 'true') {
$sRegex = str_replace('/', '\/', $sSearch);
} else {
$sRegex = preg_quote($sSearch, '/');
}
$searchTermsAny[] = array(
$dataProps[$i] => new MongoRegex( '/'.$sRegex.'/i' )
);
}
}
}
任何建议将不胜感激
更新:
感谢saj,似乎可以通过使用$where子句使用部分_id查找项目,如下所示:
$where: "this._id.toString().match(/pattern/i)"
我试图将其添加到这样的php代码中:
if ( !empty($input['sSearch']) ) {
$sSearch = $input['sSearch'];
for ( $i=0 ; $i < $iColumns ; $i++ ) {
if ($input['bSearchable_'.$i] == 'true') {
if ($input['bRegex'] == 'true') {
$sRegex = str_replace('/', '\/', $sSearch);
} else {
$sRegex = preg_quote($sSearch, '/');
}
$searchTermsAny[] = array(
$dataProps[$i] => new MongoRegex( '/'.$sRegex.'/i',
'$where: "this._id.toString().match(/'.$sRegex.'/i)"' )
);
}
}
}
但是,现在每个查询都返回所有记录,而不仅仅是返回匹配的记录.
有任何想法吗?
解:
感谢您的帮助,我已经弄清楚了,为了在_id字段中添加开放式搜索,我需要在查询数组的$or部分中添加$where子句.
具体而言,在我的情况下,我使用了以下代码:
if ( !empty($input['sSearch']) ) {
$sSearch = $input['sSearch'];
for ( $i=0 ; $i < $iColumns ; $i++ ) {
if ($input['bSearchable_'.$i] == 'true') {
if ($input['bRegex'] == 'true') {
$sRegex = str_replace('/', '\/', $sSearch);
} else {
$sRegex = preg_quote($sSearch, '/');
}
$searchTermsAny[] = array(
$dataProps[$i] => new MongoRegex( '/'.$sRegex.'/i')
);
}
}
// add this line for string search inside the _id field
$searchTermsAny[]['$where'] = "this._id.str.match(/$sSearch/)";
}
谢谢您的帮助 :)
就性能而言,我同意这是错误的方法,并且我将确保添加一个带有_id的附加字段以使性能更好,但到目前为止,我至少已经找到了解决该问题的有效方法.
解决方法:
$regex和MongoRegex(即相等匹配中使用的BSON regex类型)仅支持对字符串的匹配,因此您不能直接将它们与ObjectId一起使用.
关于最后一个代码示例,您尝试在MongoRegex构造函数中使用$where:
$searchTermsAny[] = array(
$dataProps[$i] => new MongoRegex( '/'.$sRegex.'/i',
'$where: "this._id.toString().match(/'.$sRegex.'/i)"' )
);
MongoRegex的构造函数采用单个字符串(例如/ foo / i),并从中得出模式和标志. $where旨在用作顶级查询运算符(不与任何字段名称关联).我不了解您对$dataProps [$i]所做的事情,但是让我们假设您正在构造一个单个$where查询以匹配ObjectId的字符串表示形式.查询文档如下所示:
{ $where: 'this._id.str.match(/00005/)' }
请注意,我在这里访问str属性,而不是调用toString().这是因为toString()实际上返回ObjectId的外壳表示形式.您可以通过在外壳中检查其源代码来查看:
> x = new ObjectId()
ObjectId("5409ddcfd95d6f6a2eb33e7f")
> x.toString
function (){
return "ObjectId(" + tojson(this.str) + ")";
}
另外,如果您只是检查_id的十六进制表示形式中是否存在子字符串,则可能要使用indexOf()(带有!= -1比较)而不是使用带有正则表达式的match().
就是说,如果您不将$where与可以使用索引的其他查询条件结合使用,通常不是一个好主意.这是因为$where为结果集中所考虑的每个文档调用JavaScript解释器.如果将其与其他更具选择性的条件结合使用,MongoDB可以使用索引并使用$where缩小需要评估的文档的范围;但是,如果您使用$where并在最坏的情况下扫描许多文档或进行表扫描,那么您将陷入困境.
您最好在每个包含_id十六进制字符串表示形式的文档中创建第二个字段.然后,您可以索引该字段并使用正则表达式对其进行查询.非锚定的正则表达式查询仍然会有点效率低下(请参阅:文档中的regex index use ),但这仍然比使用$where快得多.
此解决方案(复制_id字符串)将为每个文档增加一些存储空间,但是您可以认为额外的24-30字节(字符串有效负载和短字段名)可以忽略不计.
内容总结
以上是互联网集市为您收集整理的php-使用部分_id字符串查找mongodb文档全部内容,希望文章能够帮你解决php-使用部分_id字符串查找mongodb文档所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。