查找嵌套文档并将文档推入嵌套文档

时间:2020-08-09 14:40:10

标签: mongodb mongoose

所以我今天开始学习mongoDB和moongoose。我有以下架构:

{
    username: {
        type : String,
        required : true,
        unique: true,
        trim : true
    },
    routines : {
        type: [
            {   
                _id : mongoose.Schema.Types.ObjectId, 
                name : String, 
                todos : [
                    {
                        _id : mongoose.Schema.Types.ObjectId, 
                        todo : String, 
                        isCompleted : Boolean
                    }
                ]
            }
        ],
    }
}

例如:

{
   "username": "John",
   "routines": [
       {
          "_id" : 1234, //just for an example assume it to be as 1234
          "name" : "Trip plan",
          "todos" : [
             {
                "_id": 1213123,
                "todo": "book flight",
                "isCompleted" : "false"
             }....
          ]
       }......
    ]
} 

我想做的是,首先我要使用用户名从集合中选择一个文档,然后在例程(对象数组)中,我要通过id选择一个特定的例程,该例程将由用户在请求中给出正文,现在在选定的例程中,我想放入todos数组。

对于上面的示例,假设选择用户名john的文档,然后从_id为1234的例程数组中选择一个对象,然后向其待办事项中添加待办事项。

我花了整整一天的时间寻找如何做的东西,同时我学会了数组过滤器,投影之类的概念。但是仍然不知道该怎么做。另外,我在Stack Overflow中阅读了很多答案,但我听不懂。

PS:我对MongoDB和mongoose还是很陌生,可能我的问题很愚蠢,按照堆栈溢出标准可能并不好,我对此表示歉意。

1 个答案:

答案 0 :(得分:1)

您处在正确的轨道上,您确实想使用arrayFilter来实现这一目标。

这是一个简单的例子:

// the user you want.
let user = user;

await db.routines.updateOne(
    {
        username: user.username
    },
    {
        $addToSet: {
            "routines.$[elem].todos": newTodo
        }
    },
    {arrayFilters: [{'elem._id': "1234"}]}
);