En la búsqueda de agregación de MongoDb, ¿el let necesita un formato especial?
Estoy tratando de usar la búsqueda MongoDB $ con las subconsultas no correlacionadas.
Usando MongoDB 3.6.12 (el soporte comenzó en 3.6)https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#join-conditions-and-uncorrelated-sub-queries
El siguiente paso de canalización está funcionando, sin embargo, si cambio el primer "usuarioB" por el segundo, no se devuelven resultados.
{
from: 'friendships',
let: { requestuser: ObjectId("5c0a9c37b2365a002367df79"), postuser: ObjectId("5c0820ea17a69b00231627be") },
pipeline: [
{
$match : {
$or : [ { "userA" : ObjectId("5c0820ea17a69b00231627be"), "userB" : ObjectId("5c0a9c37b2365a002367df79") // "userB" : '$$requestuser'
},
{
"userA" : ObjectId("5c0a9c37b2365a002367df79"),
"userB" : ObjectId("5c0820ea17a69b00231627be")
}
],
"accepted" : true
}
},
{
$project: {v: 'true'}
}
],
as: "match"}
Resultados con ObjectId codificado de forma rígida:
"match" : [
{
"_id" : ObjectId("5d6171dd319401001fd326bf"),
"v" : "true"
}
]
Resultados usando variable:
"match" : [
]
Siento que los ObjectIds necesitan un tratamiento especial. Todos los ejemplos que pude encontrar están usando variables simples como cadenas.
Para verificar que '$$ requestUser' contenía un valor, lo probé en la proyección:
"match" : [
{
"_id" : ObjectId("5d6171dd319401001fd326bf"),
"v" : ObjectId("5c0a9c37b2365a002367df79")
}
]
Respuestas
Cuando usa subconsultas no co-relacionadas, necesita usar $exprpara pasar una variable. Puede intentar algo como seguir.
{
$match: {
$expr: { $or: [
{
$and:[ { $eq: [ "userA", ObjectId("5c0820ea17a69b00231627be") ]
},
{
$eq: [ "userB", ObjectId("5c0a9c37b2365a002367df79") ] }, { $eq: [ "userB", "$$requestuser" ] } ] }, { $and:[
{
$eq: [ "userA", ObjectId("5c0a9c37b2365a002367df79") ] }, { $eq: [ "userB", ObjectId("5c0820ea17a69b00231627be") ]
}
]
}
]
},
"accepted": true,
}
}
He creado una demostración de muestra para mostrar cómo $expr
funciona dentro de la lookup
: Demostración de muestra para subconsultas no correlacionadas