¿Hay alguna forma de que Mongo devuelva alguna indicación (bandera, campo, etc.) si una entrada en $in no coincide con ningún docs ?
Por favor vea mi Mongo Playgrond
Eso solo devuelve con éxito todos los documentos impares.
¿Cómo puedo tener alguna indicación de que no se encontraron los pares?
Me gustaría hacer esto dentro de Mongo. Obtengo que puedo iterar a través de los resultados en JS y realizar una diff .
Fwiw, este $in realidad será la primera etapa de un $match en un aggregate . Así que tal vez pueda usar algo como addFields para las diferencias.
¡Gracias!
Entonces, mi resultado deseado podría ser que cada coincidencia negativa aún obtenga un documento de retorno ... pero con una nueva propiedad found:false como la siguiente. Entonces... en mi ejemplo, los números pares no son fundados y sería genial ver algo como...
{ "_id": ObjectId("5a934e000102030405100006"), "key": 2, "found": false }, { "_id": ObjectId("5a934e000102230405000006"), "key": 4, "found": false }, { "_id": ObjectId("5a934e000122030405000006"), "key": 6, "found": false } Tal vez, también sería más limpio poner found como verdadero para todas las coincidencias positivas.
O... tal vez devuelva un subarreglo de los que no coinciden (que podría ser más limpio en el procesamiento posterior)
No hay una forma directa de hacer esto en MongoDB. Puede probar la consulta de agregación para manejar los requisitos personalizados.
Aquí he agregado una consulta de agregación para lograr su requisito, pero no estoy seguro de cuáles son sus datos exactos,
Aporte:
[ { "key": 1 }, { "key": 2 }, { "key": 3 }, { "key": 4 }, { "key": 50 }, { "key": 6 }, { "key": 7 } ]$match su $in condiciones$facet para separar resultados y números no encontradosresult es obtener los resultados del documento finalnotFound es encontrar las claves no encontradas$group por nulo y obtener claves únicas del resultado usando $addToSet$setDifference para obtener la diferencia de dos matrices, primero es su entrada y el segundo número de resultado disponible$project para mostrar los campos obligatorios db.collection.aggregate([ { $match: { key: { $in: [1, 3, 5, 7] } } }, { $facet: { result: [], notFound: [ { $group: { _id: null, key: { $addToSet: "$key" } } }, { $project: { key: { $setDifference: [[1, 3, 5, 7], "$key"] } } } ] } } ])Resultado:
[ { "notFound": [ { "key": [5] } ], "result": [ { "key": 1 }, { "key": 3 }, { "key": 7 } ] } ]El segundo enfoque , según su muestra de resultados esperados,
$addFields para agregar un nuevo campo found$in para verificar que la key tiene valor en la matriz proporcionada, si es así, devuelva verdadero, de lo contrario, falso db.collection.aggregate([ { $addFields: { found: { $in: ["$key", [1, 3, 5, 7]] } } } ])Resultado:
[ { "key": 1, "found": true }, { "key": 2, "found": false }, { "key": 3, "found": true }, { "key": 4, "found": false }, { "key": 50,"found": false }, { "key": 6, "found": false }, { "key": 7, "found": true } ]