从我的评论来看,我对你的用例或在需要加入字符串的意义上的解释有点困惑。您指定的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 值被认为是“区分大小写的”,因此大小写确实很重要。