Mongo:查找文档,其中field是字符串文字的前缀,而不使用$ where

时间:2016-02-22 23:32:30

标签: mongodb

我想找到给定字段是输入值前缀的所有文档。在SQL中它看起来像这样:

... where input_value like concat(field, '%')

我想在Mongo 2.4.8(非常优选)中使用$where进行。使用$where很容易,但我无法使用$where,因为我想使用管道,因此我可以使用$project来派生某些字段。 apparently您无法在$where的管道中使用$match。而且据我所知,你不能在正常的find() projection - argh中使用管道$project - 离子算子。

1 个答案:

答案 0 :(得分:1)

这样做的一种方法是构建$regex模式。下面的示例演示了regexp的构造和用法。还有其他方法可以构建正则表达式。

示例插入脚本:

db.t.insert([
{"name":"sampleString"},
{"name":"sam"},
{"name":"s"},
{"name":"sample"}
])

示例代码:

var input = "sample";
var pattern = ''
input.split('').reverse().forEach(function(i,j){pattern = '('+i+pattern+')?'}) // (s(a(m(p(l(e)?)?)?)?)?)?
var regexp = new RegExp("^"+pattern+"$");

并将其用作:

db.t.find({"name":{$regex:regexp}});

或:

db.t.aggregate([
{$match:{"name":{$regex:regexp}}}
])

那会给你:

{ "_id" : ObjectId("56cba179d99d86bcb7251107"), "name" : "sam" }
{ "_id" : ObjectId("56cba179d99d86bcb7251108"), "name" : "s" }
{ "_id" : ObjectId("56cba19fd99d86bcb725110c"), "name" : "sample" }
  

据我所知,你不能在正常的find()投影中使用管道$ project-ion运算符 - argh。

您可以使用find()语句中的项目字段,如下所示,但您无法修改投影字段。

db.t.find({"name":{$regex:regexp}},{"fieldToProject":1});