Я пытаюсь использовать $ lookup mongoDb. Я использую mon goose в приложении React.
Вот мой файл модели группы
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const GroupSchema = new Schema({
users: {type: Array}, //["id",..]
name: {type: String},
pending: {type: Array}
});
const Group = mongoose.model('Group',GroupSchema);
module.exports = Group;
Вот мой файл модели пользователя
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const UserSchema = new Schema({
name: {type: String},
email: {type: String, unique: true},
});
const User = mongoose.model('User',UserSchema);
module.exports = User;
Здесь это пример группы:
{ "users": [],
"admin": [
"5eac9981c6a12c190814ec2d"
],
"pending": [
"5ead65e3cb971e31a4d1c538"
],
"_id": "5ead578c145003326cbceda6",
"name": "Group 1",
"__v": 0 }
Вот пример пользователя:
{
"_id": "5ead65e3cb971e31a4d1c538",
"name": "Patate",
"email": "patate@orange.fr",
"__v": 0
}
Все примеры непосредственно извлечены из моей базы данных, я пытаюсь получить пользовательский элемент, соответствующий userId, включенному в ожидающий массив в документе группы.
const Group = require('../models/Group.model');
const Users = require('../models/User.model');
Group.aggregate(
[{$lookup:
{
from: Users.collection.name,
localField: "pending",
foreignField : "_id",
as: "members"
}},
{$project: {members:1,pending:1 }}]
)
.exec((err, result)=>{
if (err) {
res.status(500).json(err);
}
if (result) {
res.status(200).json(result);
}
});
Но проблема в том, что я всегда получаю пустой массив для поля members.
Редактировать 1
Я пытался преобразовать каждую строку в ObjectId, но вывод пуст: mongoplayground Проблема, похоже, связана с использованием mon goose, поскольку при использовании этого query работает в mongoplayground, но не работает с использованием mon goose, например:
Group.aggregate([
{
$lookup: {
from: "Users",
localField: "pending",
foreignField: "_id",
as: "members"
}
}
])
.exec((err, result)=>{
if (err) {
res.status(500).json(err);
}
if (result) {
res.status(200).json(result);
}
});