如何将 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 格式的主要内容,如果未能解决你的问题,请参考以下文章

从Node JS中的MongoDB查询中获取数据

如何将 mongodb 数据从服务器(node.js)检索到我的 AngularJS 路由

使用适用于 Node JS 的 mongodb 本机驱动程序记录所有查询

如何使用node js,reactjs,express从实际网页中的mongodb中获取数据

带有 Node Js 的 Mongodb

如何从 Node.js / Express 应用程序的 Mongoose 预挂钩中查询?