首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大小写敏感字段的$lookup

大小写敏感字段的$lookup
EN

Stack Overflow用户
提问于 2018-07-09 15:35:57
回答 1查看 1.8K关注 0票数 3

我知道怎么做对案件不敏感的搜索。

例子:

  • members.email:aaa@aaa.com但是:
  • users.email:AAA@aaa.com db.getCollection('members').aggregate( {$lookup:{‘来自’用户‘,'localField':'members.email','foreignField':'email','as':'users'}},{$unwind:{path:'$users',preserveNullAndEmptyArrays: true}},{$match:{$match:{ $exists: false }} );

集合成员看起来如下:

代码语言:javascript
复制
{
"_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如下所示:

代码语言:javascript
复制
{
"_id" : ObjectId("5a7dfce545e13f0233b2e451"),
"email" : "AAA@gmail.com",
"__v" : 0
}

{
"_id" : ObjectId("5b43ac89bfd90aa9cc4a68c2"),
"email" : "bbb@gmail.com",
"__v" : 0
}

这是我使用的代码:

代码语言:javascript
复制
    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:{ $exists: true }}时,速度是可以的,但是当{$match:{$match:{ $exists: false }}时,速度几乎是60倍。(1秒vs 1分钟)

没有校对,速度总是快的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-10 02:38:25

您需要使用localField聚合将foreignField$toLower转换为小写,这样就可以轻松地匹配字段。

代码语言:javascript
复制
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" }
  }}
])
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51249218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档