mongodb Mongoose聚合多个嵌套数组

ebdffaop  于 2022-11-03  发布在  Go
关注(0)|答案(3)|浏览(289)

我有3个模式:
第一个
我想执行一个查询,返回如下内容:

{
        "_id": "id",
        "username": "username",
        "password": "password",
        "tasks": [
            "_id": "id",
            "title": "title",
            "deadline": "deadline",
             "finished": false,
            "subtasks": [
                         {
                          "_id": "id",
                          "title": "title",
                          "deadline": "deadline",
                          "finished": false
                         }
                        ]

        ]
}

据我所知,聚合应该能做到这一点,但我不太清楚如何用它来处理嵌套数组。我知道关系数据库更适合这一点,但这是我目前所处的情况。任何帮助都是感激不尽的!

jjjwad0x

jjjwad0x1#

您可能不需要聚合,因为您的用户模式已经将任务作为一个数组包含在其中,因此您可以通过mongoose对用户记录调用“populate”。

xjreopfe

xjreopfe2#

userSchema中,将ref: 'task'或您命名任何内容添加到task model中,以将其指向您的任务集合。

const userSchema = new mongoose.Schema({
    username:{
        type: String,
        unique: true
    },
    password:{
        type: String
    },
    tasks:{
        type:[mongoose.Types.ObjectId],
        ref: 'task'
    }
})

taskSchema相同,在子任务集合中添加ref: 'subtask'或其他名称。

const taskSchema = new mongoose.Schema({
    title:{
        type: String
    },
    finished:{
        type: Boolean
    },
    deadline:{
        type:Date
    },
    subtasks:{
        type:[mongoose.Types.ObjectId],
        ref: 'subtask'
    }
})

这样你就可以使用populate函数而不是aggregate

let populateQuery = [{ path: "task", select: "", populate: { path: "subtask", select: "" } }];

在这种情况下,由于subtasktask中一个字段,因此我们具有嵌套填充

let populateQuery = [{ path: "task", select: "", populate: { path: "subtask", select: "" } }];

let users = await Users.find({}).populate(populateQuery);
5jdjgkvh

5jdjgkvh3#

我按照建议使用了populate方法

userSchema.find({_id: mongoose.Types.ObjectId(req.params.userId)}).populate({
        path: 'tasks',
        populate: { path: 'subtasks' }
      })

相关问题