挣扎于猫鼬查询,将不同的对象推送到单个深层嵌套对象中的不同数组中
Struggle with mongoose query, pushing different Objects into different arrays in a single deeply nested object
我只是想不通查询,即使它允许编写单个查询以将 4 个不同的对象推送到深深嵌套在用户对象中的 4 个不同的数组中。
我从前端收到 PATCH 请求,其正文如下所示:
{
bodyweight: 80,
waist: 60,
biceps: 20,
benchpress: 50,
timestamp: 1645996168125
}
我想创建 4 个对象并将它们推送到 Mongo Atlas
中的用户数据中
{date:1645996168125, value:80}
到 user.stats.bodyweight
<-array
{date:1645996168125, value:60}
到 user.stats.waist
<-array
...等等
我正在尝试找出第二个参数:
let user = await User.findOneAndUpdate({id:req.params.id}, ???)
但如果可能的话,我很乐意用任何其他猫鼬方法更新它。
PS:我不是故意使用 mongoDB 给出的 _id
试试这个:
await User.findOneAndUpdate(
{id:req.params.id},
{$addToSet:
{"stats.bodyweight":{date:1645996168125, value:80} }
}
)
您需要使用 $push
运算符。它接受路径作为字段名称,因此您可以指定每个数组的路径。
我假设您的请求中包含的字段是固定的(每个请求都有相同的四个 属性 名称/数组)
let user = await User.findOneAndUpdate(
{ id: req.params.id },
{
$push: {
"stats.bodyweight": {
date: 1645996168125,
value: 80,
},
"stats.waist": {
date: 1645996168125,
value: 60,
},
// ...
},
}
);
如果字段是动态的,使用对象和 if 条件,如下所示:
const update = {};
if ("bodyweight" in req.body) {
update["stats.bodyweight"] = {
date: 1645996168125,
value: 80,
};
}
// ...
let user = await User.findOneAndUpdate(
{ id: req.params.id },
{
$push: update,
}
);
if 条件只是为了演示原理,您可能希望使用更严格的类型检查/验证。
我只是想不通查询,即使它允许编写单个查询以将 4 个不同的对象推送到深深嵌套在用户对象中的 4 个不同的数组中。
我从前端收到 PATCH 请求,其正文如下所示:
{
bodyweight: 80,
waist: 60,
biceps: 20,
benchpress: 50,
timestamp: 1645996168125
}
我想创建 4 个对象并将它们推送到 Mongo Atlas
中的用户数据中{date:1645996168125, value:80}
到 user.stats.bodyweight
<-array
{date:1645996168125, value:60}
到 user.stats.waist
<-array
...等等
我正在尝试找出第二个参数:
let user = await User.findOneAndUpdate({id:req.params.id}, ???)
但如果可能的话,我很乐意用任何其他猫鼬方法更新它。
PS:我不是故意使用 mongoDB 给出的 _id
试试这个:
await User.findOneAndUpdate(
{id:req.params.id},
{$addToSet:
{"stats.bodyweight":{date:1645996168125, value:80} }
}
)
您需要使用 $push
运算符。它接受路径作为字段名称,因此您可以指定每个数组的路径。
我假设您的请求中包含的字段是固定的(每个请求都有相同的四个 属性 名称/数组)
let user = await User.findOneAndUpdate(
{ id: req.params.id },
{
$push: {
"stats.bodyweight": {
date: 1645996168125,
value: 80,
},
"stats.waist": {
date: 1645996168125,
value: 60,
},
// ...
},
}
);
如果字段是动态的,使用对象和 if 条件,如下所示:
const update = {};
if ("bodyweight" in req.body) {
update["stats.bodyweight"] = {
date: 1645996168125,
value: 80,
};
}
// ...
let user = await User.findOneAndUpdate(
{ id: req.params.id },
{
$push: update,
}
);
if 条件只是为了演示原理,您可能希望使用更严格的类型检查/验证。