node.js - 仅在 mongoose 中的填充数组中删除文档 objectid

标签 node.js mongodb mongoose mongodb-query

我在尝试使用填充查询从数组中删除 objectid 时遇到了非常困难的事情。

这是我的架构

var userSchema = new Schema({
  username: String,
  password: String,
  books: [{type: Schema.Types.ObjectId, ref: 'Book'}]
  }
);

var bookSchema = new Schema({
  bookid: {type:String, unique:true, required:true},
  imgURL: String,
  fortrade: Boolean
});

问题出在下面显示的查询中。当我只希望它删除 books 数组中的 objectid 时,它会删除 book 模式项。

users.findOne({'_id':userid}).populate('books').exec(function(usererr,userdata){
        if (usererr) return console.error(usererr);

        userdata.books.forEach(function(elm,idx){
            if(elm.bookid==_book.bookid){
                userdata.books[idx].remove();
            }
        })
    });

最佳答案

如果您只想从 .populate() 中选择相关对象输出中的引用字段,则只需提供您想要或想要删除的字段列表在 .populate() 内调用:

users.findOne({'_id':userid})
    .populate('books',"-_id")
    .exec(function(usererr,userdata){
       // userdata contains related without the _id field
    });

因此 .populate() 中的第二个参数指定您要在后续查询中选择的字段。 - 符号表示“排除”该字段,否则您需要指定要具体包含的字段列表。

这是基本的 MongoDB 字段“投影”。这里的一条规则是您不能“混合”包含或排除两者。所以要么明确:

.populate('books','bookid imgURL forTrade')

或者只是排除“特殊”字段:

.populate('books', '-_id -__v')

其中 _id 是一般的“始终包含”主键,__v 是 mongoose 生成的版本键,您可能也不想在结果中使用它。

另见 Limit Fields to Return in a Query来自核心文档,以及 .select() 下的 mongoose 缩短语法.

关于node.js - 仅在 mongoose 中的填充数组中删除文档 objectid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35120859/

相关文章:

mongodb - 如何索引我的集合以使用复合多键索引

javascript - 使用 Mongoose 迭代数据库条目中的变量

javascript - Mongoose 问题: schema not defined

node.js - firebase-functions@0.7.5 需要 firebase-admin@~5.5.0 的同级,但没有安装?

java - Spring Data 中 MongoOperations 中的 findOne 方法的行为是什么?

node.js - SSL 错误 : Unable to verify the first certificate for ingress kubernates service

Mongodb: 更新数据时主机上出现 "Network error while attempting to run command ' getlasterror'

node.js - Mongoose 子文档插入到另一个集合中,同时在父模式中保留关系

javascript - 执行函数作为异步 Node.js 脚本的最后一件事

javascript - 如何使用 material webcomponents 创建基本的 Node.js 项目?