社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  MongoDB

Mongodb查询与if条件匹配形成多个空值字段

Rahul Anand • 5 年前 • 1067 次点击  

我有一个json . sender.client和receiver.client不能总是值

下面是示例json的一部分:

{"sender" : {
        "id" : "5d95", 
        "name" : "Name1", 
        "phone" : "123456",
        "client" : "spec1"
    }, 
    "receiver" : {
        "id" : "5d95683", 
        "name" : "name2", 
        "phone" : "342235", 
        "client" : "spec1"
    }
}

{"sender" : {
        "id" : "52fes", 
        "name" : "Name2", 
        "phone" : "3334321",
        "client" : "spec2"
    }, 
    "receiver" : {
        "id" : "5efse", 
        "name" : "name3", 
        "phone" : "7353344", 
        "client" : "spec1"
    }
}

我的目标是过滤条件 (sender.client=spec1或receiver.client=spec1) 然后显示所有字段,即如果客户端名称匹配,则必须显示其他必需字段。我一直在尝试$project和$match,但是match不使用$cond,所以我选择了$eq的替代路径,但这并不能帮助我过滤掉我的需求。以下是我的代码:

    { 
        "$project" : {
            "sendername" : {
                "$cond" : {
                    "if" : {
                        "$eq" : [
                            "$sender.client", 
                            "spec1"
                        ]
                    }, 
                    "then" : "$sender.name", 
                    "else" : 0.0
                }
            }, 
            "sendername1" : {
                "$cond" : {
                    "if" : {
                        "$eq" : [
                            "$receiver.client", 
                            "spec1"
                        ]
                    }, 
                    "then" : "$receiver.name", 
                    "else" : 0.0
                }
            }
        }
    }

我想在$eq的空间中使用$match。我该如何完成?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/56141
 
1067 次点击  
文章 [ 1 ]  |  最新文章 5 年前
prasad_
Reply   •   1 楼
prasad_    5 年前

这个 $match $expr 可以根据条件进行筛选: (sender.client = spec1 or receiver.client = spec1)

我的目标是过滤条件,如果(sender.client=spec1或 receiver.client=spec1)然后显示所有字段,即

您可以添加进一步的筛选器以匹配 name 字段(有两个“name”字段, sender.name receiver.name

var queryFilter = { $cond: {
                      if: { $or: [ 
                               { $eq: [ "$sender.client", "spec1" ] },
                               { $eq: [ "$receiver.client", "spec1" ] }
                            ]
                      },
                      then: true,
                      else: false
                 }
};

db.test.aggregate( [
{
    $match: { 
              $expr: { $eq: [ queryFilter,  true ],
              $or: [ { "sender.name" : "name3" }, { "receiver.name" : "name3" } ]  } 
    }
}
] )

匹配筛选器为: $expr: {...} $or: [...] .

$project )之后 $匹配