#node.js #mongodb #mongoskin #nosql
#node.js #mongodb #mongoskin #nosql
Вопрос:
Я работаю над своим первым проектом веб-разработки, включающим серверную часть, и я даю MongoDB шанс. В настоящее время я работаю над простой панелью администратора, где указан каждый пользователь, и, нажав на этого пользователя, администратор может войти и вручную отредактировать их информацию, обновить и вернуться к основному списку пользователей, чтобы увидеть изменения.
Я пытаюсь использовать этот collection.save()
метод для обновления существующих пользователей, но столкнулся с проблемой, когда вместо простого обновления создается дубликат документа с соответствующим _id
номером. Вот изображение, иллюстрирующее, что я имею в виду, и вот весь мой код для обновления:
router.post('/updateUser', function(req, res) {
var db = req.db;
var collection = req.collection;
var userId = req.body.userId;
var djStatus = req.body.djStatus;
var access = req.body.access;
var firstName = req.body.firstName;
var lastName = req.body.lastName;
var email = req.body.email;
var phone = req.body.phone;
var studentStatus = req.body.studentStatus;
var macIdNum = req.body.macIdNum;
var iclass = req.body.iclass;
var gradYear = req.body.gradYear;
var show = req.body.show;
var blurb = req.body.blurb;
collection.save(
{
_id: userId,
djStatus: djStatus,
access: access,
firstName: firstName,
lastName: lastName,
email: email,
phone: phone,
studentStatus: studentStatus,
macIdNum: macIdNum,
iclass: iclass,
gradYear: gradYear,
show: show,
blurb: blurb
}, function (err, doc) {
if (err) {
res.send('there was a problem updating');
} else {
console.log(doc ' doc');
res.location('admin/users');
res.redirect('admin/users');
}
});
});
Я действительно не уверен, почему это происходит. любая помощь будет высоко оценена!
Комментарии:
1. Можете ли вы выполнить find() через оболочку mongo, показывающую эти документы? Существует уникальный индекс _id, который не должен допускать дубликатов.
2. да, я могу. они также дублируются в оболочке, что меня очень смущает. думал, что _Id должен был предотвратить это:
3. Можете ли вы опубликовать вывод оболочки, а также вывод db.collection.getIndexes(), где collection — это имя вашей коллекции?
4. изображение вывода оболочки более внимательно просматривая выходные данные, я вижу, что проблема в том, что обновление не преобразует _id в ObjectId. как мне сделать так, чтобы это произошло?
5. попробуйте: _id = новый идентификатор объекта (идентификатор пользователя)
Ответ №1:
Из сообщения я не уверен, какой драйвер mongodb вы используете, но save(), вероятно, не используется для обновления документа в mongodb. В используемом вами драйвере mongodb должна быть функция update(). Например, в драйвере mongoskin это синтаксис для вставки / обновления:
collection.update(_id: userId, {$set: data}, {safe:true, upsert:true}, function (err, result) {
// check err and result and do something
});
Комментарии:
1. сохранить () можно использовать для обновления, если вы планируете заменить весь документ.