我知道如何进行不区分大小写的搜索。
例子:
- members.email:
aaa@aaa.com
BUT : users.email:
AAA@aaa.com
db.getCollection('members').aggregate([ {$lookup: {'from': 'users', 'localField': 'members.email', 'foreignField': 'email', 'as': 'users'}}, {$unwind: {path: '$users', preserveNullAndEmptyArrays: true}}, {$match : { users: { $exists: false } }}, ]);
集合成员的样子如下:
{
"_id" : ObjectId("5b439c02a5439e00568291fe"),
"members" : [
{
"email" : "aaa@gmail.com"
},
{
"email" : "bbb@gmail.com"
},
{
"email" : "ccc@gmail.com"
}
],
"groupname" : "abuse",
"active" : true,
"createdAt" : ISODate("2018-07-09T17:31:46.098Z"),
"updatedAt" : ISODate("2018-07-09T17:31:46.098Z"),
"__v" : 0
}
集合成员member_user的样式如下:
{
"_id" : ObjectId("5a7dfce545e13f0233b2e451"),
"email" : "AAA@gmail.com",
"__v" : 0
}
{
"_id" : ObjectId("5b43ac89bfd90aa9cc4a68c2"),
"email" : "bbb@gmail.com",
"__v" : 0
}
这是我使用的代码:
db.getCollection('member').aggregate([
{$unwind: "$members"},
{$lookup: {'from': 'member_user', 'localField': 'members.email', 'foreignField': 'email', 'as': 'users'}},
{$unwind: {path: '$users', preserveNullAndEmptyArrays: true}},
{$match : { users: { $exists: false } }},
],
{
collation: {
locale: 'en_US',
strength: 1
}
}
);
当数据集较小时,速度通常很快。但是我有24K个成员和7K个用户。正如我所说,当{$match : { users: { $exists: true } }}时,速度还可以,但当{$match : { users: { $exists: false } }}时,速度几乎慢了60倍(1秒 vs 1分钟)。
没有排序规则(collation),速度总是很快的。
localField
和foreignField
是否区分大小写匹配? - Ashh