Коллекция MongoDB.save() дублирующие объекты

#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. сохранить () можно использовать для обновления, если вы планируете заменить весь документ.