Пн goose $ проблемы с поиском - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь использовать $ 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);
    }
    });

1 Ответ

0 голосов
/ 03 мая 2020

Я нашел решение, на самом деле я использую https://cloud.mongodb.com/ и, выполняя поиск по коллекциям, я обнаружил, что название коллекции отличается от того, которое я использовал. В конце имя коллекций было «пользователи», а не «пользователь», как я указал в файле модели пользователя.

Последний код, который я использую:

const Group = require('../models/Group.model');
const User = require('../models/User.model');
Group.aggregate([
        {
            $project: {
                pending: {
                    $map: {
                        input: "$pending",
                        as: "item",
                        in: {
                            $toObjectId: "$$item"
                        }
                    }
                }
            }
        },
        {
            '$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);
    }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...