在MongoDB中按查询表达式搜索

时间:2014-05-06 00:02:01

标签: mongodb secondary-indexes

如何通过MongoDB中的查询表达式进行搜索?像Lastname + Firstname,Lastname和Firstname是两个独立的字段?搜索字符串将是SmithJohn。这可能吗?我还可以利用索引编制吗?

索引定义为ensureIndex({LastName:1, FirstName:1},{unique:true})

我应该提一下,这将是该集合的索引。实际上,更重要的是,我需要能够找到数据(这是索引的完全匹配),而不知道我正在处理哪个集合或索引并使用集合名称(提供)来获取所有这些)。它可能是一个简单或复合的索引,但不需要是其他任何东西。一个集合具有Date_1,另一个集合具有Lastname_1_Firstname_1作为索引。

典型的请求看起来像/col/people/key/SmithJohn。我也有一些简单的索引,比如/col/events/key/2014-05-05

只是旁注。使用ensureIndex({LastName:1, FirstName:1},{unique:true}),像Matt Hat这样的名字会与Mat That冲突(注意T)。

1 个答案:

答案 0 :(得分:0)

从我评论的内容来看,我对你的用例感到有点困惑,或者在需要加入字符串的意义上解释。您指定的unique索引应该可以正常运行:

db.collection.ensureIndex({"LastName":1, "FirstName":1},{ "unique":true })

只要您将正确的参数提供给.find(),那么这很好:

db.collection.find({ "LastName": "Smith", "FirstName": "John" })

所以你的问题似乎是在你的API中分解这个问题。这实际上更像是一种语言实现方法,但JavaScript中的一些常规方法是:

使用正则表达式分割输入

var param = "SmithJohn";
results = param.split(/(?=[A-Z][^A-Z])/); // yields [ "Smith", "John" ]

var obj = db.collection.findOne({ 
    "LastName": results[0], 
    "FirstName": results[1]
})

让端点接受路径中的参数

app.get("/col/people/lastname/:LastName/firstname/:FirstName"), 
  function(req,res) {

    var obj = db.collection.findOne( req.params );

对请求有效负载中的数据进行编码

客户端:

$.ajax({ 
    type: "GET", 
    headers: { "Content-type": "application/json" }, 
    url: "/col/people/query", 
    data: JSON.stringify({ LastName: "Smith", FirstName: "John" }) 
})

服务器:

app.get("/col/people/query"), function(req,res) {

    var obj = db.collection.findOne( req.params );

所以虽然这是所有类型的伪代码(虽然正则表达式分裂是真实的,而其他方法接近真实的实现),但它应该给出关于如何处理这个的一般想法,并且不应该创建一个串联密钥,只是为了适合您当前的API。

正如您在此处的第二个问题所示,名称之间的唯一索引没有冲突,例如" Matt Hat"和#34; Mat That"因为它们没有连接,所以要求考虑组合两个键。最重要的是,MongoDB值被视为"区分大小写" 因此案例确实很重要。