我有一个播放列表的集合,其中包含项目数组
{
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 问题?
答案 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')});