Me pregunto si es posible usar un operador de agregación de búsqueda de $ dentro del campo de un operador de mapa de $. Estoy tratando de asignar los VIN dentro de los objetos carData a los identificadores de documentos correspondientes en una colección de VIN. ¿Hay alguna manera de lograr esto usando $búsqueda dentro de $mapa donde puedo hacer coincidir el campo vin dentro de mis objetos carData con campos vin dentro de mi colección VIN para asignar una identificación en lugar de vin?
CarData Collection: carData: [ {vin: 123456789, make: "Dodge"}, {vin: 987654321, make: "Honda"} ] Vin Collection: [ { _id: ObjectId("1dsf1234125") Vin: 123456789 }, { _id: ObjectId("1dsf1234124") Vin: 987654321 }, ]Resultado Esperado
carData: [ {vin: ObjectId("1dsf1234125"), make: "Dodge"}, {vin: ObjectId("1dsf1234124"), make: "Honda"} ]Método 1
db.carDatas.aggregate([ { $unwind: "$carData" }, { $lookup: { from: "Vins", localField: "carData.vin", foreignField: "Vin", as: "docs" } }, { $project: { make: "$carData.make", vin: { $first: "$docs._id" }, _id: 0 } }, { $group: { _id: null, carData: { $push: "$$ROOT" } } }, { $unset: "_id" } ])Usando las muestras de datos de la publicación de la pregunta, esta agregación devuelve el resultado esperado (cambie los nombres de la colección de manera adecuada):
db.cars_collection.aggregate([ { $lookup: { from: "vins_collection", localField: "vin", foreignField: "Vin", as: "car_vins" } }, { $project: { _id: 0, make: 1, vin: { $arrayElemAt: [ { $map: { input: "$car_vins", in: "$$this._id" } }, 0 ] } } }, ])El resultado se verá así:
{ "make" : "Dodge", "vin" : ObjectId("626a12a1ac1cc4f9d0bbd7e7") } { "make" : "Honda", "vin" : ObjectId("626a12a1ac1cc4f9d0bbd7e8") }