首页 > 解决方案 > 如何在 lambda 函数中使用 python 在 Json 输出中搜索匹配列表?

问题描述

我有两个收藏社区和个人资料。

社区收集样本数据:

_id : ObjectId("5dc1f30abcafe70001bd0075")
communityname : "testing1",
user_id : ObjectId("5dc1f2ed4a59120001a4d09d")
active_flag : 0

_id : ObjectId("5dc1f30abcafe70001bd0082")
communityname : "testing1",
user_id : ObjectId("5dc4a8b7360a0100012d3ec8")
active_flag : 0

配置文件收集样本数据:

_id : ObjectId("5dc1f2ed4a59120001a4d09d"),
username : "Haneesh",
"name" : "hani"

_id : ObjectId("5dc4a8b7360a0100012d3ec8"),
username : "Harish",
name : "Hari"

我在下面编写了这样的 lambda 函数。

 community =db.community

    comm_id = ObjectId(event['c_id'])

    user1 = list(community.aggregate([{
        "$match" : { "_id" : comm_id }
        }, 
        {
            "$lookup" : {
                "from" : "profile",
                "localField" : "user_id",
                "foreignField" : "_id",
                "as" : "details"
            }
        },
        { "$unwind" : "$details" },
        {
            "$project" : {
                "_id" : 0,
                "username" : "$details.username",
                "name" : "$details.name"
                }
        }
        ]))

    user2 = json.loads(json.dumps(user1, default=json_util.default))
    return user2

我已经执行了 lambda 函数,我得到如下输出:

[
  {
    "username": "anvithpm026",
    "name": "Anvith P M"
  },
  {
    "username": "shailu",
    "name": "shail"
  },
  {
    "username": "sukumar",
    "name": "suku"
  }
]

现在我关心的是,如何搜索匹配列表。例如,如果一个字母与用户名匹配,那么它会得到用户名和名称。我试过使用正则表达式,但没有用。请帮我解决。提前致谢。

标签: pythonmongodb

解决方案


一个小的调整可以完成这项工作,下面是查询:

user1 = list(community.aggregate([{
    "$match": { "_id": ObjectId("5dc1f30abcafe70001bd0075") }
},
{
    "$lookup": {
        "from": "profile",
        "localField": "user_id",
        "foreignField": "_id",
        "as": "details"
    }
}, { "$unwind": "$details" }, { "$match": { "details.username": /eesh/i } }, {
    "$project": {
        "_id": 0,
        "username": "$details.username",
        "name": "$details.name"
    }
}]))

/eesh/i请根据您的要求动态传递。另一方面,我尝试自己添加这个过滤器{ "details.username": /eesh/i }——$lookup这样我们可以避免跟随$unwind&$match阶段,但是由于我们有两个过滤器要检查——由于使用regexin $exprof 的限制很少$match,这个查询是一个 &即使这更容易做到。


推荐阅读