Estoy tratando de buscar una colección secundaria en mongodb usando moongose en node.js pero buscará todos los registros secundarios, quiero buscar solo registros activos.
La colección principal es la colección secundaria de usuarios: publicación que contiene una publicación publicada por el usuario y tiene un ID de usuario como referencia de la colección de usuarios. Intenté debajo de la consulta pero no tuve suerte
Muestra de colección de usuario:
{ "_id" : ObjectId("584016e28880811461000007"), "fname" : "Test", "lname" : "user", "email" : "test@user.com", }, { "_id" : , "fname" : "Test2", "lname" : "user2", "email" : "test2@user.com", }Muestra posterior a la colección:
{ "_id" : ObjectId("5863aed8cafb42674600000e"), "user_id" : ObjectId("584016e28880811461000007"), "title" : "Post 1", "is_deleted" : false }, { "_id" : , "user_id" : ObjectId("584016e28880811461000007"), "title" : "Post 2", "is_deleted" : true }Consulta que probé:
Users.collection.aggregate([ { $lookup: {from: "Posts", localField: "_id", foreignField: "user_id", as: "Posts"} }, { $match : { $or : [{"Posts._id" : {$exists : true}, "Posts.is_deleted" : false}] }}, {$project: {fname: "$fname", lname : "$lname", email : "$email", "publishedPosts" : {$size : "$Posts"}}} ])Resultado que obtuve del código anterior:
[ {"fname" : "Test", "lname" : "user", "email" : "test@user.com", "publishedPosts" : 2}, {"fname" : "Test2", "lname" : "user2", "email" : "test2@user.com", "publishedPosts" : 0} ]Resultado esperado:
[ {"fname" : "Test", "lname" : "user", "email" : "test@user.com", "publishedPosts" : 1}, {"fname" : "Test2", "lname" : "user2", "email" : "test2@user.com", "publishedPosts" : 0} ]busca todas las publicaciones, si is_deleted es falso o verdadero
Por favor, ayúdenme con una consulta similar que funcione para mí.
La etapa $match que estás usando es incorrecta. La primera condición ( {"Posts._id" : {$exists : true} ) es inútil porque cada documento debe tener un campo _id (consulte el campo mongodb _id para obtener más detalles).
Actualización: Realice la etapa $match antes de $lookup para obtener mejores resultados. Busque desde Publicaciones a Usuarios, luego relaje Usuarios y agrupe documentos para la suma
esta consulta devuelve el resultado que espera:
db.Posts.aggregate([ { $match:{ is_deleted:false } }, { $lookup:{ from:"Users", localField:"user_id", foreignField:"_id", as:"Users" } }, { $unwind:"$Users" }, { $group:{ _id:"$user_id", lname:{ $first:"$Users.lname" }, fname:{ $first:"$Users.fname" }, email:{ $first:"$Users.email" }, publishedPosts:{ $sum:1 } } } ])producción:
{ "_id" : ObjectId("584016e28880811461000007"), "lname" : "user", "fname" : "Test", "email" : "test@user.com", "publishedPosts" : 1 }puedes probar esto, funciona
colección de la tienda
{ name:"shop1", status:true, _id : ObjectId("583d0c1f2bd2cbdb117053c5") } { name:"shop2", status:false, _id : ObjectId("583d0c1f2bd2cbdb117053c6") }recogida de pedidos
{ orderNo:1, price:100, product:"product1", shop:ObjectId("583d0c1f2bd2cbdb117053c5") }prueba esto
db.getCollection('orders').aggregate([ { $lookup: { from: "shop", localField: "shop", foreignField: "_id", as: "shopData" } }, { $match : { $or: [ { "shopData.status": true}] } } ])resultado :
[{ orderNo:1, price:100, product:"product1", shop:[{ name:"shop1", status:true, _id : ObjectId("583d0c1f2bd2cbdb117053c5") }] }]