简体   繁体   中英

$or inside $and in $filter condition not working

I am using golang with mongodb,mgo collection

My mongodb collection is

 **department**
    {
     dept_id:1,
     dept_name:'CSE',
     dept_overview:'overview'
    }
   ................

**employee**
    {
    emp_id:1,
    emp_name:'abc',
    qualification:'PHD',
    emp_dept:'CSE',
    city:'xyz'
    }
    {
    emp_id:2,
    emp_name:'xyz',
    qualification:'PHD',
    emp_dept:'CSE',
    city:'xyz',
    status:1
    }
    ..........

Below is my Go code using pipeline

    var conditionParam []bson.M
    if(city!=""){
        conditionParam = []bson.M{
        bson.M{"$eq": []string{"$$element.qualification", "PHD"}},
            bson.M{"$eq": []string{"$$element.emp_dept", "CSE"}},
                bson.M{"$eq": []string{"$$element.city", "xyz"}},
                bson.M{"$or": []bson.M{
            bson.M{"$$element.status": bson.M{"$exists": false}},
            bson.M{"$$element.status": 1}}, 
                },
            }
    }else if(){
    --------------------
}

matchStage:=bson.M{"$match":bson.M{'dept_id':1}}
lookupStage:=bson.M{"$lookup": bson.M{
    "from":         "employee",
    "localField":   "dept_name",
    "foreignField": "emp_dept",
    "as":           "result_list",
}}
    pipeline := getCollection.Pipe([]bson.M{
            matchStage,
            lookupStage,
            {"$addFields": bson.M{
                "result_list": bson.M{
                    "$filter": bson.M{
                        "input": "$result_list",
                        "as":    "element",
                        "cond": bson.M{
                            "$and": conditionParam,
                        },
                    },
                },
            }},
        })

This code return error

Unrecognized expression '$$element.status'

How We can use $or inside $and in golang using mgo collection?

when I put comment on or statement it returns the result but when I used the or it gives error.Can anyone suggest me how to use $or inside $and in pipeline

 var conditionParam []bson.M
        if city == "" {
            conditionParam = []bson.M{
                bson.M{"$eq": []string{"$$element.qualification", "PHD"}},
                bson.M{"$eq": []string{"$$element.emp_dept", "CSE"}},
                bson.M{"$eq": []string{"$$element.city", "xyz"}},
                bson.M{"$or": []interface{}{"$exists", []interface{}{"$$element.status", false}}},
                bson.M{"$or": []interface{}{"$$element.status", 1}}, 
            }
    } 

I tried this code to write conditionParam and It worked for me. I did not check all the cases yet but I want to know yours suggesstion, Is it right way to write the or operator to check field exists and if exists check its value.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM