如何通过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)。
答案 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值被视为"区分大小写" 因此案例确实很重要。