$поиск не работает при объединении mongodb

#python #mongodb #aggregate #pymongo #lookup

Вопрос:

У меня есть вопрос

 fromDate = '2021-10-01'
toDate = '2021-10-10'
dataType = 'location'
typeId = '60dd6d303da6c17209d5ef68'
workerType = 'Employee'

start_date = datetime.strptime(str(fromDate) " 00:00:00", '%Y-%m-%d %H:%M:%S')
end_date = datetime.strptime(str(toDate) " 00:00:00", '%Y-%m-%d %H:%M:%S')

if dataType == 'location':
    found_location = prodLocationCollection.find_one({"_id":ObjectId(typeId)})
    match_filter = {'Date':{"$gte":start_date,"$lte":end_date},
                                    'Location':found_location["locationName"],
                                    'locationId':{'$exists':True},
                                'workerType':workerType
                                    }
elif dataType == 'user':
    match_filter = {'Date':{"$gte":start_date,"$lte":end_date},
                                    'employeeId':ObjectId(typeId),
                                    'locationId':{'$exists':True},
                                'workerType':workerType
                                    }
    


output = list(prodAttendanceCollection.aggregate([{'$match': match_filter},
                        {"$group":{'_id':{
                                'employeeId':'$employeeId',
                                'workerId':'$workerId',
                                'workerFullName':'$workerFullName'
                                },
                                'dailyPointsArray':{
                                    '$push':{
                                    'Date':'$Date',
                                    'createdAs':'$createdAs',
                                    'Points':'$shiftPoints'
                                    }
                                },
                                'total_shift_points':{'$sum':'$shiftPoints'},
                                'total_duration':{'$sum':'$duration'},
                                }
                        },
        { '$lookup':
            {
               'from': "users",
               'localField': "employeeId",
               'foreignField': "_id",
               'as': "userInfo"
            }
    }
                                                  
]))
 

Это дает результат

 [{'_id': {'employeeId': ObjectId('60dd78184524e6c116e22a44'),
   'workerId': '1008',
   'workerFullName': 'RADHIKA GOTHIVREKAR'},
  'dailyPointsArray': [{'Date': datetime.datetime(2021, 10, 1, 0, 0),
    'createdAs': 'ABSENT',
    'Points': None},
   {'Date': datetime.datetime(2021, 10, 2, 0, 0),
    'createdAs': 'ABSENT',
    'Points': None},
   {'Date': datetime.datetime(2021, 10, 3, 0, 0),
    'createdAs': 'ABSENT',
    'Points': None},
   {'Date': datetime.datetime(2021, 10, 4, 0, 0),
    'createdAs': 'ABSENT',
    'Points': None},
   {'Date': datetime.datetime(2021, 10, 5, 0, 0),
    'createdAs': 'IN-TIME PUNCHED',
    'Points': 0},
   {'Date': datetime.datetime(2021, 10, 6, 0, 0),
    'createdAs': 'FULL-TIME PUNCHED',
    'Points': 1},
   {'Date': datetime.datetime(2021, 10, 7, 0, 0),
    'createdAs': 'FULL-TIME PUNCHED',
    'Points': 1},
   {'Date': datetime.datetime(2021, 10, 8, 0, 0),
    'createdAs': 'FULL-TIME PUNCHED',
    'Points': 1},
   {'Date': datetime.datetime(2021, 10, 9, 0, 0),
    'createdAs': 'FULL-TIME PUNCHED',
    'Points': 1},
   {'Date': datetime.datetime(2021, 10, 10, 0, 0),
    'createdAs': 'ABSENT',
    'Points': None}],
  'total_shift_points': 4,
  'total_duration': 0,
  'userInfo': []},
 {'_id': {'employeeId': ObjectId('60dd77e34524e6c116e1b27d'),
   'workerId': '1365',
   'workerFullName': 'HARISON NIKALJE'},
  'dailyPointsArray': [{'Date': datetime.datetime(2021, 10, 1, 0, 0),
    'createdAs': 'ABSENT',
    'Points': None},
   {'Date': datetime.datetime(2021, 10, 2, 0, 0),
    'createdAs': 'ABSENT',
    'Points': None},
   {'Date': datetime.datetime(2021, 10, 3, 0, 0),
    'createdAs': 'ABSENT',
    'Points': None},
   {'Date': datetime.datetime(2021, 10, 4, 0, 0),
    'createdAs': 'IN-TIME PUNCHED',
    'Points': 0},
   {'Date': datetime.datetime(2021, 10, 5, 0, 0),
    'createdAs': 'IN-TIME PUNCHED',
    'Points': 0},
   {'Date': datetime.datetime(2021, 10, 6, 0, 0),
    'createdAs': 'IN-TIME PUNCHED',
    'Points': 0},
   {'Date': datetime.datetime(2021, 10, 7, 0, 0),
    'createdAs': 'ABSENT',
    'Points': None},
   {'Date': datetime.datetime(2021, 10, 8, 0, 0),
    'createdAs': 'ABSENT',
    'Points': None},
   {'Date': datetime.datetime(2021, 10, 9, 0, 0),
    'createdAs': 'ABSENT',
    'Points': None},
   {'Date': datetime.datetime(2021, 10, 10, 0, 0),
    'createdAs': 'ABSENT',
    'Points': None}],
  'total_shift_points': 0,
  'total_duration': 0,
  'userInfo': []}]
 

Как вы можете видеть, все работает, но часть поиска возвращает [] пустой массив

This is sample data of attendance amp; user

ATTENDANCE

 {
    "_id": {
        "$oid": "60dd7d723fcb2eb7df248af3"
    },
    "workerId": "2073",
    "workerFullName": "ARUN NAIR",
    "workerType": "Employee",
    "workerAadharCardNumber": "xxxxxxxxxx",
    "Date": {
        "$date": "2021-07-01T00:00:00.000Z"
    },
    "employeeId": {
        "$oid": "60dd77c14524e6c116e1692c"
    },
    "Location": "HEAD OFFICE 2",
    "sourceUnitType": null,
    "duration": null,
    "shiftPoints": null,
    "createdAs": "ABSENT",
    "ruleApplied": null,
    "detections": [],
    "locationId": {
        "$oid": "60dd6d303da6c17209d5ef68"
    },
    "workerFaceRegistered": true
}
 

пользователь

     {
    "_id": {
        "$oid": "60dd77c14524e6c116e1692c"
    },
    "workerFirstName": "ARUN",
    "workerSurname": "NAIR",
    "workerPhoneNumber": "xxxxxxxxxx",
    "workerId": "2073",
    "locationType": "HEAD OFFICE",
    "locationName": "HEAD OFFICE 2",
    "workerDesignation": "EXECUTIVE",
    "workerDepartment": "SALES",
    "workerAadharCardNumber": "xxxxxxxxxx",
    "workerType": "Employee",
    "workerEmail": "xxxxxxxxxxxx",
    "workerStatus": "REGULAR",
    "workerUsername": "2073",
    "workerPassword": "$2b$12$wBrDRYgPbRxrLG8N9Wxs2eDxGVFauZMraosrkePnYWWpZmPE1ljY2",
    "totalLoginAttemptLeft": 3,
    "lastLocationId": {
        "$oid": "60dd6d303da6c17209d5ef68"
    },
    "allowFencing": true,
    "workerFaceRegistered": true,
    "isActive": false
}
 

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

1. Я думаю USER._id , что это не приведено в вашем примере. Можете ли вы обновить свой пример, чтобы мы могли взглянуть? Кроме того, из ваших выходных данных мы можем видеть только _id.employeeId то employeeId , что вы использовали в поиске$. Возможно, вам захочется убедиться, что вы используете правильные поля для поиска, и они имеют один и тот же тип данных(т. Е. оба являются строковыми / оба являются объектными).

2. @рэй, да, конечно.

3. Тип данных, на мой взгляд, выглядит нормально. Вы пробовали использовать _id.EmployeeID в локальном поле вместо EmployeeID?

Ответ №1:

После группировки исходные поля больше не присутствуют, поэтому $employeeId их не существует, что ничему не соответствует.

Так employeeId как был перенесен _id.employeeId на групповой этап, в поиске используйте localField: "_id.employeeId"