仅在mongoose中的填充数组中删除文档objectid

时间:2016-01-31 23:32:23

标签: node.js mongodb mongoose mongodb-query

我在使用填充查询尝试从数组中删除objectids时非常困难。

这是我的架构

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时,它会删除删除书架构项。

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

1 个答案:

答案 0 :(得分:6)

如果要做的只是从.populate()中选择相关对象输出中的引用字段,那么只需提供所需字段的列表,或者想要在{{3}中删除呼叫:

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生成的版本密钥,您在结果中也可能不需要。

另请参阅核心文档中的.populate(),以及Limit Fields to Return in a Query下的mongoose缩短语法。