MongoDB - Как показать все задачи пользователя, вошедшего в систему - PullRequest
0 голосов
/ 05 октября 2018

Итак, у меня есть 3 модели: Пользователь, Проекты и Задачи ...

, и я хочу показать на своей панели инструментов все задачи пользовательских проектов пользователя, который вошел в систему, но происходит следующее:когда я вошел как, например, «user1», он показывает все задачи из коллекции и как «user2» показывает также все задачи из коллекции ... и я хочу показать только задачи от пользователя, вошедшего в систему ..

Мой пользователь не содержит задач, только проекты, и я подумал, что могу использовать совокупный поиск для этого, но я не знаю, как его использовать, и я не знаю, является ли это лучшим способомсделать это

Модель пользователя:

    let mongoose = require("mongoose");
    let passportLocalMongoose = require("passport-local-mongoose");

    let UserSchema = new mongoose.Schema({

    username: String,
    password: String,
    companyname: String,
    companyimageURL: String,
    projects: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Project'
    }]
});

UserSchema.plugin(passportLocalMongoose);

module.exports = mongoose.model("User", UserSchema);

Модель проекта:

 let mongoose = require("mongoose");

 let projectSchema = new mongoose.Schema({

    projectname: String,
    typeofproject: String,
    imageURL: String,
    dateMonthFrom: String,
    dateYearFrom: String,
    dateMonthTo: String,
    dateYearTo: String,
    tasks: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Tasks'
    }],
    user: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    }]
})

module.exports = mongoose.model('Project', projectSchema);

Задачи Модель:

let mongoose = require("mongoose");

let taskSchema = new mongoose.Schema({

    tasktitle: String,
    taskcomment: String,
    project: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Project'
    }]
})

module.exports = mongoose.model('Tasks', taskSchema);

на моем сервере :

exports.render_all_tasks = (req, res) => {


User.aggregate([
    {
        $lookup:{
            from: 'projects',
            localField: 'projects',
            foreignField: 'tasks',
            as: 'user'
                }
        }
]).exec((err) => {
    if(err) {
        console.log(err);
    }
    Task.find({}).populate('project').exec((err, tasks) => {
        if(err) {
            console.log(err);
        }

            res.send(tasks);

          });   
    });
};

коллекция пользователей:

       {
           _id: ObjectId("..."),
           projects: [ 0: ObjectId("..."), 1: ObjectId("...")],
           username: "user1",
           companyname: "company1",
           companyimageURL: "..."

        }

коллекция проектов:

       {
           _id: ObjectId("..."),
           tasks: [ 0: ObjectId("..."), 1: ObjectId("...")],
           user:  [ 0: ObjectId("...")],
           projectname: "project1",
           typeofproject: "type1",
           imageURL: "..."

        }

коллекция задач:

       {
           _id: ObjectId("..."),
           project: [ 0: ObjectId("..."),
           tasktitle: "Task 1"

        }

1 Ответ

0 голосов
/ 05 октября 2018

Вы можете напрямую запросить коллекцию проектов, чтобы получить задачи для вошедшего в систему пользователя.

Что-то вроде

Project.aggregate([
  {"$match":{"user":logged in user}},
  {"$lookup":{
    "from":"tasks",
    "localField":"tasks",
    "foreignField":"_id",
    "as":"tasks"
  }}
])

ИЛИ

Вы можете использовать агрегацию ниже в 3.6запросить из пользовательской коллекции.Это приведет к получению всех задач по всем проектам для каждого пользователя.

User.aggregate([{
  "$lookup":{
    "from":"projects",
    "let":{"projects":"$projects","user":"$_id"},
    "pipeline":[
      {"$match":{
        "$expr":{
          "$and":[
            {"$in":["$_id","$$projects"]},
            {"$in":["$$user","$user"]}
          ]
        }}
      },
      {"$lookup":{
        "from":"tasks",
        "localField":"tasks",
        "foreignField":"_id",
        "as":"tasks"
      }}
    ],
    "as":"project-tasks"
  }
}])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...