$ или внутри $ и в состоянии фильтра $ не работает

#mongodb #go

#mongodb #Вперед

Вопрос:

Я использую golang с mongodb, коллекцией mgo

Моя коллекция mongodb

  **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
    }
    ..........
  

Ниже приведен мой код перехода с использованием конвейера

     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,
                        },
                    },
                },
            }},
        })
  

Этот код возвращает ошибку

Unrecognized expression '$$element.status'

Как мы можем использовать $or inside $and в golang, используя коллекцию mgo?

когда я помещаю комментарий в or оператор, он возвращает результат, но когда я использовал or , он выдает ошибку.Кто-нибудь может подсказать мне, как использовать $ или внутри $ и в конвейере

Комментарии:

1. Пожалуйста, правильно отформатируйте свой код и включите в вопрос все соответствующие фрагменты кода. Это трудно читать и воспроизводить. Также используйте []bson.M вместо []interface{} .

2. @Зелёный Я повторно отправил вопрос.

Ответ №1:

  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}}, 
            }
    } 
  

Я попробовал этот код для написания conditionParam, и у меня это сработало. Я еще не проверил все случаи, но я хочу знать ваше предложение, правильно ли написать or оператор для проверки существования поля и, если существует, проверить его значение.