在mongoose中仅移除填充数组中的文档对象标识(ObjectId)。

4
我是一个帮助翻译文本的助手。

我正在尝试使用一种填充查询来从数组中删除对象ID,但遇到了困难。

这是我的架构:

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
});

问题出在以下查询语句。它删除了书籍模式项,而我只想删除书籍数组中的objectid。
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();
            }
        })
    });

我也遇到了同样的问题,如果您能详细提供解决方案,那将非常有帮助。 - Ammar Hayder Khan
1个回答

13

如果你只想在相关对象的输出中选择引用字段,那么只需在.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生成的版本密钥,您可能也不希望在结果中出现。

另请参见核心文档中的限制查询结果中返回的字段,以及mongoose缩写语法下的.select()


你真是个救星! - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接