Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Meteor:如何进行不区分大小写的集合。findOne()?_Mongodb_Meteor - Fatal编程技术网

Mongodb Meteor:如何进行不区分大小写的集合。findOne()?

Mongodb Meteor:如何进行不区分大小写的集合。findOne()?,mongodb,meteor,Mongodb,Meteor,我正在为用户实现一种在我正在编写的Meteor应用程序中更改用户名的方法。在接受更改之前,我想检查用户名是否已经存在。用户名可以包含大写和小写,但无论大小写,它们都必须是唯一的名称。例如,bob和bob不能同时存在 问题是我似乎不知道如何执行不区分大小写的collection.findOne()。例如,假设我有一个名为Profiles的集合,我希望能够执行以下操作: newName = "bob"; //Assume "Bob" exists as a username in the Prof

我正在为用户实现一种在我正在编写的Meteor应用程序中更改用户名的方法。在接受更改之前,我想检查用户名是否已经存在。用户名可以包含大写和小写,但无论大小写,它们都必须是唯一的名称。例如,
bob
bob
不能同时存在

问题是我似乎不知道如何执行不区分大小写的
collection.findOne()
。例如,假设我有一个名为Profiles的集合,我希望能够执行以下操作:

newName = "bob";

//Assume "Bob" exists as a username in the Profiles collection;

var isAlreadyRegistered = Profiles.findOne({"username": newName});

if (isAlreadyRegistered == null) {
  saveUsername();
};
你可以用

或者您也可以这样查询:

 var isAlreadyRegistered = Profiles.findOne({ "username" : {
                     $regex : new RegExp(newName, "i") } }
               );

有两种方法,您的里程数可能因最佳方法而异,但实际上这两种方法都相当可怕,因为MongoDB进行区分大小写的匹配:

第一种方法是使用:

Profiles.findOne({“用户名”:{
“$regex”:“^”+newName+”\\b“,“$options”:“i”
}})
以不区分大小写的方式匹配单词,并且仅匹配字符串开头的确切单词。这里的问题是您正在扫描索引

第二种方法是使用聚合进行项目:

db.collection(“profiles”).aggregate([
{“$project”:{
“用户名”:1,
“lower”:{“$toLower”:“$username”}
}},
{“$match”:{
“用户名”:newName
}}
])
当然,
newName
已经被转换成小写

这里的问题是,
$project
将覆盖管道中的所有内容。但是,如果您可以先使用
$match
,则可能会很有用


<>当然,我认为<强> >代码>聚合/代码> <强>只在服务器端可用,而不是通过Minimongo,因此需要考虑。

< P>作为您的底层用例的解决方案,我建议使用两个字段来存储用户名而不是一个。 内置用户名字段应存储用户名的小写版本。另一个额外字段存储区分大小写的原始版本


在使用之前,将对“用户名”字段进行搜索,搜索条件也将小写。

我相信我说过,并且还声明可以在服务器上使用您自己的方法。@AndrewMao为了所有读者和您自己的利益,该声明是错误的。所有框架实现在某一点上都使用并允许访问底层驱动程序及其方法,因此,通过抓取本机集合对象,您应该始终能够获得此方法,而且正如大多数框架以某种形式至少提供了“runCommand”接口一样,也可以通过这种方式完成。驱动程序中的所有MongoDB方法实际上都是以这种方式实现的。所以不管调用语法如何,都不应该说它id不可用。在一般的前提下应该做什么。您非常正确,因为需要有一个字段,该字段在文档中实际具有小写值并被索引。但是其他的选择仅仅是为了表明确实有办法做到这一点,甚至是经常被忽视的“在飞行中”。是的,这是一个有趣的案例,其中问题是问一些特定的问题,有很好的答案,但实际解决潜在问题的最佳实践并没有被问到。答案很好,但我确实想知道为什么你的第一个例子不适用于我,而第二个却适用于我。
 var isAlreadyRegistered = Profiles.findOne({ "username" : {
                     $regex : new RegExp(newName, "i") } }
               );