node.js - 如何将 MongoDB 查询从 Node.js 驱动程序格式调整为 Mongoose 格式
问题描述
对于使用 Mongoose 的查询的语法,我将不胜感激。
我有这个查询,它使用 MongoDB Node.js 驱动程序从嵌套的对象 ID 数组中删除一个 ObjectId 运行良好:
let filter = { _id : new ObjectId('5f30b40839aab119f4b3e21d'), 'groups._id': new ObjectId('5f3a23ec3680923d04ff970c') };
let update = { $pull: { "groups.$.students": new ObjectId('5f1a57a9d433f86ec0750c2c') }};
client.db('database').collection('collection').findOneAndUpdate(filter, update, function(err, res) {
if (err) console.log(err);
console.log(JSON.stringify(res, null, 2));
client.close();
});
当我尝试使用 Mongoose Schema 运行查询时,查询不会从数组中删除 ObjectId,但不会引发任何错误:
let groupFilter = { _id: existingClassroom._id, 'groups._id': groupId };
let groupUpdate = { $pull: { "groups.$.students": existingUser._id } };
await Classroom.findOneAndUpdate(groupFilter, groupUpdate, {new: true}, async (err, doc) => {
if(err){
console.log(err);
}
});
Mongoose 模式的这些字段的模式定义如下:
groups:[
{
students:[
mongoose.Schema.Types.ObjectId
],
dateCreated: {
type: Date,
default: Date.now
}
}
]
解决方案
您可以使用将字符串 id 转换为对象 id mongoose.Types.ObjectId
,
let groupFilter = {
_id: mongoose.Types.ObjectId(existingClassroom._id),
'groups._id': mongoose.Types.ObjectId(groupId)
};
let groupUpdate = {
$pull: {
"groups.$.students": mongoose.Types.ObjectId(existingUser._id)
}
};
await Classroom.findOneAndUpdate(groupFilter, groupUpdate, { new: true },
async (err, doc) => { if (err) { console.log(err); } }
);
推荐阅读
- symfony - Symfony Messenger 不会总是重启
- c++ - 如何使我的嵌套输出在 C++ 中右对齐?
- xcode - Xcode 和 Git 问题
- jquery - JQuery-confirm $.alert 不是函数
- python-3.x - 我无法用 Raspberry pi 计算°/s 数据 MPU6050
- java - 这是对 Azure 服务进行身份验证的正确且完整的身份验证方法列表吗?
- sql-server - SSRS Report Builder 如何输出最后 18 个字符之前的字符串中的所有内容?
- excel - 组合框编程
- sap-ase - Sybase ASE 中的毫秒历元转换
- java - OkHttp:单个域的单独连接池。这是个好主意吗?