mongoose 从嵌套数组中删除一个对象
我正在尝试通过从嵌套数组中删除对象来使用猫鼬查找更新文档。我的目标文档如下:
user = {
"userId" : "myId",
"connections":
[{
"dateConnectedUnix": 1334567891,
"isActive": true,
"sessions": [
{"device": "mobile", "country": "US"},
{"device": "desktop", "country": "US"}
]
}, {
"dateConnectedUnix": 1334567893,
"isActive": false,
"sessions": [
{"device": "mobile", "country": "CA"},
{"device": "desktop", "country": "CA"}
]
}]
}
这是我的尝试,但它没有更新文档:
Users.findOneAndUpdate({ "userId": "myId", "connections.dateConnectedUnix": 1334567891 },
{ $pull: { sessions: { device: "mobile" } } }, (err) => {
if (err) {
return res.status(404).json({ message: 'Error' });
}
return res.status(200).json({
success: true,
message: 'success'
});
}
);
生成的文档应如下所示:
user = {
"userId" : "myId",
"connections":
[{
"dateConnectedUnix": 1334567891,
"isActive": true,
"sessions": [
{"device": "desktop", "country": "US"}
]
}, {
"dateConnectedUnix": 1334567893,
"isActive": false,
"sessions": [
{"device": "mobile", "country": "CA"},
{"device": "desktop", "country": "CA"}
]
}]
}
基本上是通过 id 找到用户,然后通过日期找到连接,然后删除移动设备。在我的特定情况下,结果始终是一个匹配的文档和一个匹配的连接以及一个匹配的会话。
回答如下:因为你的会话数组在连接里面
尝试使用“connections.$.sessions”代替会话,这样您的查询就可以了
Users.findOneAndUpdate({ "userId": "myId", "connections.dateConnectedUnix": 1334567891 },
{ $pull: { "connections.$.sessions" : { device: "mobile" } } }, (err) => {
if (err) {
return res.status(404).json({ message: 'Error' });
}
return res.status(200).json({
success: true,
message: 'success'
});
}
);