Как предотвратить обновление функции вставки в MongoDB из Meteor?

1

У меня есть Meteor.method, который проверяет существующий документ. когда он не обнаружил, что он вставляет документ, во второй раз он обнаружил, что он обновляет и вставляет. Пожалуйста, помогите проверить и исправить мой следующий код:

'upload': function upload(data, name, eventId) {
    const wb = XLSX.read(data, {type:'binary'});
    var checkUpdate;
    XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]).forEach(r => {
        r.owner = this.userId,
        r.username = Meteor.user().username,
        r.updatedAt = new Date(),
        r.amount = Number(r.amount),
        r.eventid = eventId,
        r.firstname = r.firstname.trim(),
        r.lastname = r.lastname.trim(),
        Registers.findOne({ firstname: r.firstname, lastname: r.lastname, eventid: eventId }) ? 
        Registers.update({ firstname: r.firstname, lastname: r.lastname, eventid: eventId }, { $set: {updatedAt: r.updatedAt, amount: r.amount } })
        : 
        r.createdAt = new Date(),
        Registers.insert(r)
    })

    return wb;
},

В первый раз, если база данных пуста, она вставляет новый документ. Во второй раз, если он нашел документ, он обновил документ, а также вставил новый документ с функцией обновления, а не вставкой функции.

meteor:PRIMARY> db.registers.find({ eventid: "aZrumf45q8sBGGrY2" })
{ "_id" : "MzqD73vsgyxRTyekJ", "salution" : "Mr.", "firstname" : "qwer", "lastname" : "asdf", "gender" : "Male", "age" : "38", "province" : "chiangmai", "amount" : 1000, "owner" : "rBjWm4PRTHwAo2vRS", "username" : "mai", "updatedAt" : ISODate("2017-09-11T12:28:36.966Z"), "eventid" : "aZrumf45q8sBGGrY2", "createdAt" : ISODate("2017-09-11T12:20:49.731Z") }
{ "_id" : "suzPhYkvQQcYjZj5p", "salution" : "Mr.", "firstname" : "abcd", "lastname" : "efgh", "gender" : "Male", "age" : "30", "province" : "chiangmai", "amount" : 500, "owner" : "rBjWm4PRTHwAo2vRS", "username" : "mai", "updatedAt" : ISODate("2017-09-11T12:28:37.017Z"), "eventid" : "aZrumf45q8sBGGrY2", "createdAt" : ISODate("2017-09-11T12:20:49.739Z") }
{ "_id" : "QYgF7aLvBDwo5amuA", "salution" : "Mr.", "firstname" : "qwer", "lastname" : "asdf", "gender" : "Male", "age" : "38", "province" : "chiangmai", "amount" : 1000, "owner" : "rBjWm4PRTHwAo2vRS", "username" : "mai", "updatedAt" : ISODate("2017-09-11T12:28:36.966Z"), "eventid" : "aZrumf45q8sBGGrY2" }
{ "_id" : "XYSBxgiz5T9QXad6r", "salution" : "Mr.", "firstname" : "abcd", "lastname" : "efgh", "gender" : "Male", "age" : "30", "province" : "chiangmai", "amount" : 500, "owner" : "rBjWm4PRTHwAo2vRS", "username" : "mai", "updatedAt" : ISODate("2017-09-11T12:28:37.017Z"), "eventid" : "aZrumf45q8sBGGrY2" }

Из кода, когда я добавляю дважды, во второй раз, я теряю createdAt поле. Я не знаю почему.????

У меня есть его !!!! Большое спасибо за все комментарии

'upload': function upload(data, name, eventId) {
    const wb = XLSX.read(data, {type:'binary'});
    var checkUpdate;
    XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]).forEach(r => {
        if (!Registers.findOne({ firstname: r.firstname, lastname: r.lastname, eventid: eventId })) {
        r.owner = this.userId,
        r.username = Meteor.user().username,
        r.updatedAt = new Date(),
        r.amount = Number(r.amount),
        r.eventid = eventId,
        r.firstname = r.firstname.trim(),
        r.lastname = r.lastname.trim(),
        r.createdAt = new Date(),
        Registers.insert(r)
        } else {
        r.owner = this.userId,
        r.username = Meteor.user().username,
        r.updatedAt = new Date(),
        r.amount = Number(r.amount),
        r.eventid = eventId,
        r.firstname = r.firstname.trim(),
        r.lastname = r.lastname.trim(),
        Registers.update({ firstname: r.firstname, lastname: r.lastname, eventid: eventId }, { $set: {updatedAt: r.updatedAt, amount: r.amount } })
        }
    })
    return wb;
},
  • 0
    А какой у тебя вопрос? Этот код работает или нет?
  • 0
    «Предотвратить обновление» - на основании чего?
Показать ещё 2 комментария
Теги:
meteor

1 ответ

1
Лучший ответ

Я думаю, вы ищете метод Collection.upsert.

В основном он изменяет один или несколько документов в коллекции или вставляет их, если не найдено соответствующих документов. Возвращает объект с номерами ключей. Устанавливается (количество измененных документов) и insertId (уникальный _id документа, который был вставлен, если таковой имеется).

  • 0
    * Ankur, спасибо за вашу помощь, но я бы хотел сначала обновить, но если он не совпадает, просто вставьте из-за поля createAt.
  • 0
    Пожалуйста, оставьте свой SimpleSchema, если таковые имеются.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню