【问题标题】:remove document objectid only in populated array in mongoose仅在 mongoose 的填充数组中删除文档 objectid
【发布时间】:2016-05-09 07:59:49
【问题描述】:

我在尝试使用填充查询从数组中删除 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
});

问题在于下面显示的查询。当我只希望它删除书籍数组中的 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();
            }
        })
    });

【问题讨论】:

  • 我也遇到了同样的问题,如果你能详细给出解决方案会很有帮助。

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

如果您只想从.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 是猫鼬生成的版本键,您可能也不希望在结果中使用它。

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

【讨论】:

  • 你是救世主!
猜你喜欢
  • 2021-03-03
  • 2017-04-20
  • 2013-11-16
  • 2020-12-18
  • 2021-08-25
  • 2017-03-21
  • 2017-06-06
  • 2021-01-02
  • 2021-04-01
相关资源
最近更新 更多