如何在mongoDB + mongoose组合中创建部分搜索过滤器(/ ^)?

时间:2014-04-03 01:58:32

标签: node.js mongodb mongoose

我有一个如下所示的数据集:

{ "id" : "1.2.1", "name" : "abc1" }
{ "id" : "1.2.3", "name" : "abc2" }
{ "id" : "1.2.2", "name" : "abc3" }
{ "id" : "1.2.1", "name" : "abc4" }
{ "id" : "1.2.4", "name" : "abc5" }

我想获取所有以id = 1.2开头的记录。所以在shell中我可以愉快地使用:

db.collection.find({id : /^1.2/})

它工作正常。但是现在从node.js / mongoose尝试发出相同的find时,我希望这个1.2是一个变量。 我的问题是我不能做像

这样的事情
var q = {"id" : \/\^ +  id + "/"};

获取非法令牌错误。这可能就像JS逃避技术一样简单,我不知道。 任何帮助都将受到高度赞赏,并从多个查询中保存mongodb:)

虽然这更像是一个通用的mongoDB发现问题,如果有人可以暗示我如何使用mongoose作为类似的运算符,那就太棒了。 顺便说一下,由于性能方面的考虑,我不想在这里使用regEx。

提前致谢...

1 个答案:

答案 0 :(得分:0)

您确实意识到您正在执行的查询 是来自您的第一个示例的正则表达式操作。但似乎你遇到了如何将其转化为动态的问题。这是$regex运算符语法的来源:

var id = "1.2";

db.collection.find({ "_id": { "$regex": "^" + id } })

这通常是你如何在mongo shell之外使用运算符。

使用正则表达式的好处是,当你锚定到字段的开头时,就像你那样,你正在扫描一个完整的索引甚至可能是集合。

当您执行锚定时,索引可以受词汇匹配约束以限制扫描的内容。在你的情况下,它将是" 1.2"的词汇范围。到" 1.3"。