#mongodb #mongodb-query #aggregate
Вопрос:
У меня есть две коллекции, call
и contact
.
Я хочу присоединиться к ним и показать имя контакта в записи звонка. Приведенный ниже код-это то, что я пробовал.
ps. когда я переключаюсь "d.v":"$mobile"
на "d.v":"some number"
это, это работает, но когда я использую переменную, она не работает, в чем моя проблема ?
{
from: 'contact',
let: {"mobile":"$user"},
pipeline:[
{
"$project":{
d:{$objectToArray:"$data"},
doc:"$ROOT",
}
},
{
"$unwind":{
path: "$d",
preserveNullAndEmptyArrays: true
}
},
{
"$match":{
"d.v":"$mobile"
}
},
],
as: 'name'
}
Комментарии:
1. используйте double
$$
для объявленной переменной в let"$$mobile"
. но вы должны использовать$expr
условие для соответствия внутренним полям.$match: { $expr: { $eq: ["$$mobile", "$d.v"] } }
2. @turivishal Ты прав, я ошибся, большое спасибо
Ответ №1:
Как указано в документах:
Чтобы ссылаться на переменные на этапах конвейера, используйте синтаксис»$$».
…
Этап $match требует использования оператора $expr для доступа к переменным. Оператор $expr позволяет использовать выражения агрегации внутри синтаксиса $match.
После изменения этих двух параметров в соответствии с требованиями ваша сцена будет выглядеть следующим образом:
db.call.aggregate([
{
"$lookup": {
from: "contact",
let: {
"mobile": "$user"
},
pipeline: [
{
"$project": {
d: {
$objectToArray: "$data"
},
doc: "$ROOT",
}
},
{
"$unwind": {
path: "$d",
preserveNullAndEmptyArrays: true
}
},
{
"$match": {
$expr: {
$eq: [
"$mobile",
"$d.v"
]
}
}
},
],
as: "name"
}
}
])