Tengo una base de datos MongoDB que contiene documentos en el siguiente formato:
{ "name": "", "surname": "", "ssn": "", "tests": [ { "date": "", "attending": [ { "id": "", "role": "" } ] } ] }Un documento contiene, para cada persona, una lista de pruebas con su información relativa. Me gustaría eliminar de cada documento solo los subdocumentos (pertenecientes a la matriz de pruebas ) que se realizaron después de una fecha determinada (2019-02-22) y por una enfermera determinada (id = 0187).
Dado que todas las fechas se guardan en formato de cadena , para la comparación de fechas utilicé el operador $dateFromString de la siguiente manera:
db.Vaccinations.aggregate([ "$match": { "$expr": { "$and": [ { "$gte": [ { "$dateFromString": { "dateString": "$tests.date"}}, ISODate("2019-02-22T00:00:00Z") ]}, { "tests.attending.id" : "0187" } ] } } ]) Sin embargo, no pude usar el operador $pull para eliminar los subdocumentos correspondientes. ¿Es posible hacerlo o es $pull el operador incorrecto?
Consulta
date < "2019-02-22"nurse != "0187"nurse != "0187" se verifica usando una ruta "$test.attending.id" para obtener todas las identificaciones de esa prueba (una matriz) y probar que la intersección con ["0187"] está vacía => esa enfermera no No hagas la prueba.*puede usar updateOne o updateMany según sus necesidades
* No $dateFromString si las fechas tienen el mismo formato, como la comparación YYYY-MM-DD , funcionará, pero en general, guarde las fechas en la base de datos, hace que las cosas sean más fáciles y rápidas.
update( {}, [{"$set": {"tests": {"$filter": {"input": "$tests", "cond": {"$or": [{"$lt": ["$$test.date", "2019-02-22"]}, {"$eq": [{"$setIntersection": [["0187"], "$$test.attending.id"]}, []]}]}, "as": "test"}}}}])