删除子子数组(所有元素)

时间:2014-06-05 15:39:43

标签: node.js mongodb mongoose

我有以下mongoose架构(我删除了一些不必要的位):

var VoteSchema = new Schema({
    voter: String,
    val: {type:Number, max:1, min:-1},
    voted_at: { type: Date, default: Date.now },
    comments: [{type:String, trim:true}]
});

var LexicalEntrySchema = new Schema({
    label:{type:String,trim:true, index:true},

    images:[{
        image_uri: {type:String,trim:true},
        description: String,
        votes:[ { type: Schema.ObjectId, ref: 'Vote'} ]
    }],
});

我想删除所有词条中所有图像中的所有投票。怎么可以这样做?

1 个答案:

答案 0 :(得分:0)

您需要进行三次查询:

  1. 使用您需要的任何过滤器执行LexicalEntry.find。使用{images.votes: 1}作为投影参数。
  2. 执行LexicalEntry.update并更新步骤1中找到的所有匹配文档。{$set: {"images.votes": []}}
  3. 删除留下的投票文件:Votes.remove,其中包含您在步骤1中收集的所有ID。

  4. 正如您可能猜到的,这是次优的。您应该利用Mongo的功能来嵌入文档:

    var LexicalEntrySchema = new Schema({
        label:{type:String,trim:true, index:true},
    
        images:[{
            image_uri: {type:String,trim:true},
            description: String,
            votes: [ VoteSchema ]
        }]
    });
    

    通过执行以下操作插入新的投票:someEntryDocument.images[0].votes.push({voter: ..., val: ...})

    通过执行以下操作删除投票:someEntryDocument.images[0].votes = []

    Mongoose的人口特征最适合许多人的关系。