0

如何在 MongoDB 中按查询表达式进行搜索?类似姓氏+名字的东西,其中姓氏和名字是两个独立的字段?搜索字符串将是 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)。

4

1 回答 1

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”和“Mat That”等名称之间的唯一索引没有冲突,因为它们没有连接,要求考虑两个键的组合。最重要的是,MongoDB 值被认为是“区分大小写的”,因此大小写确实很重要。

于 2014-05-06T02:10:46.247 回答