Когда я запускаю этот запрос:
db.friendRequests.aggregate([
$lookup: {
from: "users",
localField: "author",
foreignField: "_id",
pipeline: [
{
$match: {
$expr: {
friend_id: new mongoose.Types.ObjectId(userid),
},
},
},
],
as: "userdata",
}
])
Он возвращает каждую запись в коллекции, но в ней есть конвейер. Тогда почему он не работает?
Вы можете помочь мне? Спасибо!
Детская площадка: https://mongoplayground.net/p/Eh2j8lU4IQl
Для версии mongodb ниже 5.0 (спасибо за замечание @user20042973):
$lookup
с localField
и foreignField
будет игнорировать pipeline
. Удалите их и добавьте ключ let
, чтобы включить конвейер.
Я не думаю, что это правильно на 5.0
@nimrod serok, см. здесь
Поле friend_id
присутствует в коллекции friendRequests
(источник агрегации), а не в коллекции users
, которая является целью для $lookup
. Следовательно, этот предикат должен находиться на стадии $match
, которая предшествует $lookup
:
db.friendRequests.aggregate([
{
$match: {
"friend_id": ObjectId("636a88de3e45346191cf4257")
}
},
{
$lookup: {
from: "users",
localField: "author",
foreignField: "_id",
as: "userdata"
}
}
])
Посмотрите, как это работает на примере с игровой площадкой. Обратите внимание, что я изменил inventory
на users
, предполагая, что это была просто опечатка в названии коллекции в предоставленной ссылке на игровую площадку.
Этот синтаксис неверен:
$match: {
$expr: {
friend_id: new mongoose.Types.ObjectId(userid),
},
}
Вы должны изменить его либо на
$match: {
friend_id: new mongoose.Types.ObjectId(userid),
}
Или
$match: {
$expr: {
$eq: [
"$friend_id", new mongoose.Types.ObjectId(userid)
]
},
}
Ни один из них не работает
Возвращает пустой userdata
Не могли бы вы обновить свой вопрос с помощью (текстовых) образцов документов?
простите, с чем?
Образцы документов, которые вы используете, в текстовом формате. Мы должны быть в состоянии воспроизвести проблему, чтобы помочь. Еще лучше, если бы вы могли просто поделиться примером mongoplayground.net, в который загружены ваши документы. Кроме того, каково значение userid
в вашем коде и откуда оно берется? Я вообще не вижу других ссылок на него в вашем вопросе, поэтому, возможно, ничего не совпадает.
идентификатор пользователя поступает из внешнего интерфейса (углового) и работает. Даже если жестко закодировать идентификатор, он не работает
Судя по скриншотам, документы в коллекции users
не содержат поля friend_id
, что будет еще одной причиной того, что агрегация работает не так, как вы хотите. Я хотел бы помочь в дальнейшем, но я не могу сделать это без образцов документов (в формате, который можно скопировать) или игровой площадки, где я могу воспроизвести проблему. Пожалуйста, сообщите нам, если вы отредактируете свой вопрос, чтобы включить эту информацию. Смотрите также, почему изображения бесполезны
хорошо, если я отправлю вам экспортированные коллекции?
я создал ссылку на mongoplayground, если она полезна
Большое спасибо! Можете ли вы также предоставить нам пример значения для userid
?
Я обновил ссылку с жестко запрограммированным идентификатором пользователя
когда он работает, он должен возвращать 2 запроса, потому что третий - исходящий запрос
Ваши решения работают! Большое спасибо!
И как мне использовать ключ
let
?