如何将 MongoDB 查询从 Node.js 驱动程序格式调整为 Mongoose 格式
Posted
技术标签:
【中文标题】如何将 MongoDB 查询从 Node.js 驱动程序格式调整为 Mongoose 格式【英文标题】:How to adapt MongoDB query from Node.js driver format to Mongoose format 【发布时间】:2020-12-06 09:54:39 【问题描述】:对于使用 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: existingClas-s-room._id, 'groups._id': groupId ;
let groupUpdate = $pull: "groups.$.students": existingUser._id ;
await Clas-s-room.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
]
【问题讨论】:
【参考方案1】:您可以使用 mongoose.Types.ObjectId
将字符串 id 转换为对象 id,
let groupFilter =
_id: mongoose.Types.ObjectId(existingClas-s-room._id),
'groups._id': mongoose.Types.ObjectId(groupId)
;
let groupUpdate =
$pull:
"groups.$.students": mongoose.Types.ObjectId(existingUser._id)
;
await Clas-s-room.findOneAndUpdate(groupFilter, groupUpdate, new: true ,
async (err, doc) => if (err) console.log(err);
);
【讨论】:
以上是关于如何将 MongoDB 查询从 Node.js 驱动程序格式调整为 Mongoose 格式的主要内容,如果未能解决你的问题,请参考以下文章
如何将 mongodb 数据从服务器(node.js)检索到我的 AngularJS 路由
使用适用于 Node JS 的 mongodb 本机驱动程序记录所有查询