mongodb - $lookup 区分大小写的字段
问题描述
我知道如何进行不区分大小写的搜索。
例子 :
- members.email:
aaa@aaa.com
但是: 用户邮箱:
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 秒对 1 分钟)
无需整理,速度总是很快
解决方案
您需要使用聚合将localField
andforeignField
转换为小写,$toLower
然后您可以轻松匹配您的字段。
db.collection.aggregate([
{ "$unwind": "$members" },
{ "$addFields": { "members.email": { "$toLower": "$members.email" }}},
{ "$lookup": {
"from": "users",
"let": { "membersEmail": "$members.email" },
"pipeline": [
{ "$addFields": { "email": { "$toLower": "$email" }}},
{ "$match": { "$expr": { "$eq": [ "$email", "$$membersEmail" ] } } }
],
"as": "members.email"
}},
{ "$unwind": "$members.email" },
{ "$group": {
"_id": "$_id",
"groupname": { "$first": "$groupname" },
"active": { "$first": "$active" },
"members": { "$push": "$members.email" }
}}
])
推荐阅读
- ios - XCode 项目停止工作并出现一堆奇怪的错误
- metabase - 在 AWS DocumentDB 上将字符串转换为 Int
- assembly - 如何在函数调用后保持所有变量不变(相同)?
- ruby-on-rails - Bootstrap 未在 Rails 应用程序中加载所有样式
- python - 在图形执行中使用“sample_weight”不兼容的形状
- amazon-web-services - Spring Boot 和 AWS RDS 只读副本
- css - 键盘感知滚动视图占用屏幕空间
- android - 为什么 Android 应用程序 - 当应用程序从 Android Studio 停止时重新启动?
- rust - 包装 AsyncRead
- python - 有没有办法像 c# 一样在 python 中清除控制台?