2014-10-08 4 views
6

У меня есть эта маленькая схема для пользователей:Mongoose - удалить поддокумент элемент массива

{ 
username: String, 
contacts: Array 
} 

Так, например, контакты некоторых пользователей будет выглядеть следующим образом:

{ 
username: "user", 
contacts: [{'id': ObjectId('525.....etc'), 'approved': false}, {'id':ObjectId('534.....etc'), 'approved': true}] 
} 

Теперь мне нужно удалить элемент от контактов так что я:

model.findByIdAndUpdate(23, {'$pull': { 
       'contacts':{'id':'525.....etc'} 
       }}); 

, но, похоже, не работает, п Ошибки вывода, но он не будет удален, я просто хотел бы вернуть этот документ для пользователя:

{ 
    username: "user", 
    contacts: [{'id':ObjectId('534.....etc'), 'approved': false}] 
    } 

, как добиться этого?

ответ

10

Оператор $pull фактически просто выполняет условия на элементе массива, на котором он работает. Кажется, что ваш вопрос может на самом деле не показать, что вы, вероятно, работаете с значением ObjectId, которое mongoose создает по умолчанию для всех полей массива.

Таким образом, вы могли бы на ваш запрос, как это, после импорта метод ObjectId создания:

model.findByIdAndUpdate(23, { 
    '$pull': { 
     'contacts':{ '_id': new ObjectId(someStringValue) } 
    } 
}); 

Или на самом деле вы можете определить свою «схему» немного лучше, и мангуст будет на самом деле «AutoCast» ObjectId для вас, основываясь на «тип» определен в схеме:

var contactSchema = new Schema({ 
    approved: Boolean 
}); 

var userSchema = new Schema({ 
    username: String, 
    contacts: [contactSchema] 
}); 

Это позволяет мангуст «следовать правилам» для строго типизированных определений полей. Итак, теперь знает, что у вас на самом деле есть поле _id для каждого элемента массива контактов, а «тип» этого поля - это фактически ObjectId, поэтому он будет автоматически перебрасывать значения «String», представленные как истинный ObjectId.

+0

привет спасибо, но теперь я получил эту ошибку: ** [MongoError: исключение: не может использовать часть (контакты contacts.id) для обхода элементов ({контактов: [{ID: ObjectId ('543394bb964ac60915ceba8b'), одобрено: false}, {id: ObjectId ('543399f9964ac60915ceba8c'), одобрено: false}]}) ** что это может быть? Я использовал вашу точную аннотацию - – sbaaaang

+0

@sbaaaang Что вы на самом деле делаете? Вы используете форму «точечной нотации», как вам сказали? BTW Спасибо за то, что я четко показал, что ваши фактические данные отличаются от того, как вы опубликовали, что, вероятно, является частью проблемы здесь снова. Пожалуйста, отредактируйте, чтобы показать свою реальную структуру данных. –

+0

есть используя * точка запись * подобный u сказал, да im используя ObjectIds, но хорошо, что это не проблема, я думаю: P nope? (отредактированный вопрос) – sbaaaang

1

окончательный!

MongoDB: 

"imgs" : {"other" : [ { 
     "crop" : "../uploads/584251f58148e3150fa5c1a7/photo_2016-11-09_21-38-55.jpg", 
     "origin" : "../uploads/584251f58148e3150fa5c1a7/o-photo_2016-11-09_21-38-55.jpg", 
     "_id" : ObjectId("58433bdcf75adf27cb1e8608") 
            } 
          ] 
        }, 
router.get('/obj/:id', function(req, res) { 
var id = req.params.id; 



Model.findOne({'imgs.other._id': id}, function (err, result) { 
     result.imgs.other.id(id).remove(); 
     result.save();    
    }); 
Смежные вопросы