所以我今天开始学习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还是很陌生,可能我的问题很愚蠢,按照堆栈溢出标准可能并不好,我对此表示歉意。
答案 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"}]}
);