Mongoose - 从数组中删除多个对象(不完全匹配)

时间:2017-04-06 08:05:28

标签: arrays node.js mongodb mongoose

我有一个播放列表的集合,其中包含项目数组

{

    userId: {
        type        : String,
        required    : true,
        index       : true,
        unique      : true
    },

    items: [
        {
            id: { // do not mix up with _id, which is the autogenerated id of the pair {id,type}. ID is itemId
                type        : Schema.Types.ObjectId
            },
            type: {
                type        : String
            }
        }
    ]

}

当我将一对{id,type}推送到项目时,Mongo会自动将 _id 字段添加到项目中(但我不关心它)。< / p>

现在我想从 items 数组中一次删除几个“对”。

我尝试过使用$ pullAll,但它需要完全匹配,而且我不知道 _id ,所以它不会从项中删除任何内容

playlistModel.update({userId:userId},{$pullAll:{items:[{id:"123",type:"video"},{id:"456",type:"video"}]}},null,function(err){

我尝试过使用$ pull和不同的变体,但它从项目中移除了所有对象

playlistModel.update({userId:userId},{$pull:{items:{"items.id":{$in:["123","456"]}}}},null,function(err){

playlistModel.update({userId:userId},{$pull:{items:{$in:[{id:"123",type:"video"},{id:"456",type:"video"}]}}},null,function(err){

我错过了什么,或者我问的是没有实现的东西?

如果是后者,有没有办法解决 _id 问题?

2 个答案:

答案 0 :(得分:1)

好的,我发现了一种使用$ pull的方法:

playlistModel.update({userId:userId},{$pull:{items:{id:{$in:["123","456"]}}}},null,function(err){ 

它不考虑类型,但我看不出任何问题,因为无论如何,id在所有类型中都是唯一的。

虽然我会稍等一下,看看是否有人有更好的解决方案

修改

在Veeram的帮助下,我得到了另一个解决方案,IMO更优雅,因为我没有数据库中不需要的_id,而且$ pullAll选项在这里看起来更正确

var playlistItemSchema = mongoose.Schema({
    id: { // do not mix up with autogenerated _id. id is itemId
        type        : Schema.Types.ObjectId
    },
    type: {
        type        : String
    }
},{ _id : false });

var schema = new Schema({

    userId: {
        type        : String,
        required    : true,
        index       : true,
        unique      : true
    },

    items: [playlistItemSchema]

});


playlistModel.update({userId:userId},{$pullAll:{items:[{id:"123",type:"video"},{id:"456",type:"video"}]}},null,function(err){

答案 1 :(得分:0)

提示:  您可以使用_id字段来处理播放列表模型数据。

mongoose api:new mongoose.Types.ObjectId用于生成Object_id

let _id=new mongoose.Types.ObjectId;
     playlistModel.updateMany({_id:_id},{ $set: { name: 'bob' }}).exec(data=>{console.log('exec OK')});