我想找到给定字段是输入值前缀的所有文档。在SQL中它看起来像这样:
... where input_value like concat(field, '%')
我想在Mongo 2.4.8(非常优选)中使用$where
进行。使用$where
很容易,但我无法使用$where
,因为我想使用管道,因此我可以使用$project
来派生某些字段。 apparently您无法在$where
的管道中使用$match
。而且据我所知,你不能在正常的find() projection - argh中使用管道$project
- 离子算子。
答案 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});