consultas - Use la agregación en mongodb para realizar la actualización después de las coincidencias de consulta
inner join mongodb (2)
Aún no está 100% seguro de lo que está intentando, pero esto creará un documento de resultados de longitud 1, con valores distintos para todas las coincidencias de brand_ids.
Luego, en el resultado, recorrerá todas las marcas y las eliminará de su matriz brand_ids.
couponmodel.aggregate(
{ $match: { "brand_id": { $in: brand_ids } } },
{ $group: { _id: null, brands: { $addToSet: "$brand_id" } } },
function(err, doc) {
doc.brands.forEach(function(brand) {
var idx = array.indexOf(brand);
if (idx > -1) {
brand_ids.splice(idx, 1);
}
});
}
)
Estoy escribiendo una consulta mongodb donde estoy usando agregados, mi consulta se da a continuación
couponmodel.aggregate(
{ $match : { ''brand_id'': { $in: brand_ids } } },
{ $project: { _id: 1, arr_size: { $size: "$coupon_codes" }, curr_ctr:1 } },
function(err, docs) {
if (err) {
} else {
if (docs.length > 0) {
console.log(''docs: '', docs);
}
}
});
};
Ahora el problema al que me enfrento es después de la consulta de coincidencia, quiero eliminar (extraer) este brand_id de mi brand_ids, que es una matriz, porque quiero usar la consulta de coincidencia para los brand_ids restantes.
¿Alguien puede decirme cómo puedo hacer esto?
gracias.
ACTUALIZACIÓN- Como creo que no he mencionado claramente lo que estoy tratando de hacer, considere a continuación el caso
Supongamos que mi matriz brand_ids contiene estas cadenas
brand_ids = ["id1", "id2", "id3", "id4", "id5"]
y mi base de datos tiene documentos debajo
{
"brand_id": "id1",
"name": "Levis",
"loc": "india"
},
{
"brand_id": "id1",
"name": "Levis"
"loc": "america"
},
{
"brand_id": "id2",
"name": "Lee"
"loc": "india"
},
{
"brand_id": "id2",
"name": "Lee"
"loc": "america"
}
Salida JSON deseada
{
"name": "Levis"
},
{
"name": "Lee"
}
Ahora, para la consulta anterior, quiero obtener resultados con solo un "Levis" y un "Lee", pero como aparecen dos veces en el documento, serán devueltos dos veces. Por eso, cuando aparece el primer "Levis" quiero eliminarlo de brand_ids que el próximo "Levis" no será devuelto y el mismo es el caso de "Lee". También estoy haciendo esto para reducir el tiempo de consulta, así que no me respondas como una consulta grupal con nombres de marca y todo.
Espero que mi pregunta sea clara ahora.
ACTUALIZACIÓN- Como todo el mundo me dice que use el grupo ahora, déjame decirte por qué creo que aumentará el tiempo de consulta.
Para el ejemplo anterior, supongamos que tengo 25000 documentos con "nombre" como "Levis" y 25000 de documentos donde "nombre" es "Lee", ahora si utilizaré el grupo, entonces se consultarán y agruparán los 50000 documentos por "nombre".
Pero de acuerdo con la solución que deseo, cuando se encuentre el primer documento con "Levis" y "Lee", no tendré que buscar los miles de documentos restantes.
Espero que lo entiendas , en realidad mi pregunta es cómo usar findOne en cada elemento de mi matriz y cuando obtengo algún elemento, no lo busques.
Prueba esto
couponmodel.aggregate(
{ "$match" : { ''brand_id'': { $in: brand_ids } } },
{ "$group": { _id: name, "name" : {"$first":"$name"}}},
{"$project" : {name : "$name","_id" : false}},
function(err, docs) {
if (err) {
console.error("Razor_pay_webhook Error 2 err: " + err);
res.json({success : 0, message : "Sorry Please Try Again"});
return next();
} else {
if (docs.length > 0) {
console.log(''docs: '', docs);
}
}
});
};