Me preguntaba, ¿hay alguna forma en MongoDB de obtener todos los documentos de una colección, excluyendo los que existen en otra, sin usar la agregación?
Déjame explicarme más;
Tengo una colección de "Usuarios" y otra colección donde hay una matriz de objetos. Algo como esto:
Usuario
} "_id": "61e6bbe49d7efc57f895ab50", "name": "User 1" }, { "_id": "61e6b9239d7efc57f895ab02", "name": "User 2" }, { "_id": "61cae6176d0d9a36efd8f190", "name": "User 3" }, { "_id": "61cade886d0d9a36efd8f11a", "name": "User 4" },La otra colección se ve así:
{ users: [ { user: { "_id": "61e6b9239d7efc57f895ab02", "name": "User 2", }, ... }, { user: { "_id": "61cae6176d0d9a36efd8f190", "name": "User 3", }, ... }, ], },Me gustaría obtener todos los usuarios de la "matriz 1", excepto los de la "matriz 2". Así que el resultado debería ser:
[ { "_id": "61e6b9239d7efc57f895ab02", "name": "User 1" }, { "_id": "61cae6176d0d9a36efd8f190", "name": "User 4" }, ],Entonces, ¿hay alguna manera de hacerlo sin la necesidad de hacer una agregación?
puedes usar $and así:
const found = await User.find({ $and: [ { _id: { $in: array1 } }, { _id: { $nin: array2 } } ] });Para cualquiera que busque una solución, si desea agregar un nuevo elemento a una matriz de objetos, donde, de alguna manera, olvidó inicializar el campo _id , recuerde que debe hacerlo, porque mongo agrega ese campo automáticamente (para usarlo para filtrar/ indexación).
Todo lo que tienes que hacer es escribir algo como esto;
const data = Data.create({ _id: mongoose.Types.ObjectId.createFromHexString(uid), users: [{ user: userId, initiator: true, _id: userId}], })y para la búsqueda, escribes lo que siempre escribes;
const found = await User.find({ _id: { $nin: data.users } });