MongoDB查找不遵循整理规则。

问题描述 投票:0回答:2

我想在一个网站上创建一个索引 membershipAccount 集合,它有一个整理规则集,可以让find方法找到一个 username 而不区分大小写。

[
    2,
    {
        "username" : 1.0
    },
    "username_1",
    "kollecto_prod.membershipAccounts",
    {
        "locale" : "da",
        "caseLevel" : false,
        "caseFirst" : "off",
        "strength" : 1,
        "numericOrdering" : false,
        "alternate" : "non-ignorable",
        "maxVariable" : "punct",
        "normalization" : false,
        "backwards" : false,
        "version" : "57.1"
    }
]

我有一个名为-的用户。[email protected] 在我 membershipAccounts但这是我的find查询的结果,是我的整理不正确还是我理解错了概念?

db.getCollection('membershipAccounts').find({username: "[email protected]"}) // 1 result - ok
db.getCollection('membershipAccounts').find({username: "[email protected]"}) // 0 results - nope
db.getCollection('membershipAccounts').find({username: "[email protected]"}) // 0 results - nope
db.getCollection('membershipAccounts').find({username: "[email protected]"}) // 0 results - nope

是我的整理方法不正确还是我理解错了概念?

json mongodb collation bson
2个回答
1
投票

你需要在查询中设置所需的整理规则,或者在集合上设置默认的整理规则。创建一个带有整理的索引并不会使该整理成为查询中使用的默认整理。

每个查询。

MongoDB Enterprise ruby-driver-rs:PRIMARY> db.foo.insert({v:'test'})
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise ruby-driver-rs:PRIMARY> db.foo.find({v:'TEST'}).collation({locale:'en',caseLevel:false,strength:1})
{ "_id" : ObjectId("5ed8302ba6de3bc31c771682"), "v" : "test" }

默认的整理方式

MongoDB Enterprise ruby-driver-rs:PRIMARY> c={locale:'en',caseLevel:false,strength:1}
{ "locale" : "en", "caseLevel" : false, "strength" : 1 }
MongoDB Enterprise ruby-driver-rs:PRIMARY> db.createCollection('bar',{collation:c})
{
        "ok" : 1,
        "$clusterTime" : {
                "clusterTime" : Timestamp(1591226649, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        },
        "operationTime" : Timestamp(1591226649, 1)
}
MongoDB Enterprise ruby-driver-rs:PRIMARY> db.bar.insert({v:'test'})
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise ruby-driver-rs:PRIMARY> db.bar.find({v:'TEST'})
{ "_id" : ObjectId("5ed8311fa6de3bc31c771683"), "v" : "test" }

0
投票

所以我最后做的是在我的代码中,如下所示。

var account = DBHelper.membershipAccountCollection.Find(
    x => x.Username.ToLower().Contains(username)
).FirstOrDefault();

var cu = DBHelper.customerUserCollection.AsQueryable().First(
    x => x.Email.ToLower().Contains(model.UserName)
);

这样做是可行的,因为在我的C#代码中已经有了集合对象, 所以我可以利用C#的力量来代替。我意识到这并不是对整个问题的一般答案,但在我的案例中它是有效的。如果有人对这个问题有更概括的答案,我很乐意在以后接受这个答案。

© www.soinside.com 2019 - 2024. All rights reserved.