WedX - журнал о программировании и компьютерных науках

findOneAndUpdate работает в оболочке mongo, но не обновляется с помощью node-mongodb?

У меня есть эта функция, которая ищет документ с заданным идентификатором (mID), проверяет, существует ли другое поле (u), а если нет, добавляет заданный идентификатор (uID).

Код не выдает никаких ошибок, но и не обновляет документ, однако, самостоятельно создавая запрос из одного и того же поля (два console.log) и используя их в оболочке mongo, это работает.

Результат запроса при использовании с node-mongodb-native: { ok: 1, nModified: 0, n: 0 }

'use strict';

const MongoClient = require('mongodb').MongoClient,
    async = require('async'),
    uuid = require('node-uuid'),
    winston = require('winston'),
    logger = new (winston.Logger)({transports: [new winston.transports.Console()]});

let Link = {};

function link(mId, base, uId, callback) {
    let filter = {'mId': mId},
        update = {'$set': {}};

    filter[base] = {'$exists': false};
    update['$set'][base] = uId;

    logger.info('link update', {filter: filter, update: update});
    console.log('db.Link.findOne(' + require('util').inspect(filter) + ');');
    console.log('db.Link.findOneAndUpdate(' + require('util').inspect(filter) + ', ' + require('util').inspect(update) + ', {upsert: false, new: true});');
    Link.collection('link')
    .findOneAndUpdate(
        filter,
        update,
        {
            upsert: false,
            returnOriginal: false
        }
    ).then((result) => {
        logger.info('link update ok', {result: result});
        callback();
    }).catch((error) => {
        logger.error('link update error', {error: error});
        callback(new Error(4299));
    });
}

async.waterfall([
    (callback) => {
        MongoClient.connect('mongodb://127.0.0.1/Link').then((db) => {
            logger.info('Connected to Link');
            Link = db;
            callback(null);
        }).catch((error) => {
            logger.error('init Link', {error: error});
            callback(error);
        });
    },
    (callback) => {
        let mId = uuid.v4();
        logger.info('create');

        Link.collection('Link')
        .insertOne({'mId': mId})
        .then((error) => {
            logger.info('create ok')
            callback(null, mId);
        }).catch((error) => {
            logger.error('create error', {error: error});
            callback(new Error(4299));
        });
    },
    (mId, callback) => {
        link(mId, 'link', uuid.v4(), callback);
    }
], (error) => {
    if(error) {
        logger.error('End', {error, error});
    }
    logger.info('End');
    Link.close();
});

Я также пробовал использовать функции update и updateOne, но результат тот же: работает команда, а не код.

Может ли кто-нибудь объяснить, почему команда, работающая из оболочки, не может работать, если она сделана из драйвера, и почему Mongo сообщает, что нашел документ, но не обновляет его?

узел v6.9.1, узел-mongodb-native v2.2.11

Редактировать:

Базовый документ:

{
    "_id" : ObjectId("58332c30224fe3273c7b1ba6"),
    "mId" : "37286c83-7d81-484d-b62a-310f690cac97"
}

Обновленный документ:

{
    "_id" : ObjectId("58332c30224fe3273c7b1ba6"),
    "mId" : "37286c83-7d81-484d-b62a-310f690cac97",
    "test" : "f7bb9386-eedd-43fe-890a-348cb3a97ed3"
}

Вывод регистратора:

info: Connected to Link
info: create
info: create ok
info: link update mId=f8ba93da-3b6d-43f7-9f90-4e345ba04131, $exists=false, link=f882d44d-60a3-4701-b5df-ba493c3b249b
db.Link.findOne({ mId: 'f8ba93da-3b6d-43f7-9f90-4e345ba04131',
  link: { '$exists': false } });
db.Link.findOneAndUpdate({ mId: 'f8ba93da-3b6d-43f7-9f90-4e345ba04131',
  link: { '$exists': false } }, { '$set': { link: 'f882d44d-60a3-4701-b5df-ba493c3b249b' } }, {upsert: false, new: true});
info: link update ok updatedExisting=false, n=0, value=null, ok=1
info: End

Функция init подключается к mongoDB, функция create вставляет в нее новый документ со случайным mId, который передается функции link. uId также создается случайным образом и также является UUID.

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

db.Link.findOneAndUpdate({ mId: 'f8ba93da-3b6d-43f7-9f90-4e345ba04131',

ссылка: { '$ существует': false } }, { '$ set': { ссылка: 'f882d44d-60a3-4701-b5df-ba493c3b249b' } }, {upsert: false});

обновить документ


  • Вы не показываете документ, который пытаетесь обновить, но я предполагаю, что mId и uId — это числа в документе, но строки в вашем коде. Если это так, вам нужно преобразовать, используя код, например {mId: parseInt(mId, 10)}. 21.11.2016
  • @JohnnyHK: Нет, я сохраняю только UUID (созданный из node-uuid), поэтому все строки 22.11.2016
  • @DrakaSAN - покажи нам, что выводит регистратор. Теперь мы знаем, что такое параметры, возможно, это какая-то ошибка. 22.11.2016
  • Не могли бы вы упростить это до более минимального, но полного примера, который воспроизводит проблему с примером документа, который вы показываете? Здесь слишком много неуместных вещей, связанных с построением запроса. 22.11.2016
  • @JohnnyHK: Готово, сократил код и удалил мои пользовательские зависимости, сама функция состоит из 26 строк, но я включил полный пример в 72 с инициализацией и вставкой. 22.11.2016

Ответы:


1

Что ж, вы используете неправильное название коллекции

Когда вы вставляете его, вы используете Link в верхнем регистре.

Link.collection('Link') <<<<<<<<<<<<<<<<<<<<
    .insertOne({'mId': mId})

Когда вы пытаетесь обновить, вы используете строчную ссылку.

Link.collection('link') <<<<<<<<<<<<<<<<<
    .findOneAndUpdate(
23.11.2016
  • 100 баллов - это справедливое наказание за то, что не заметил такую ​​маленькую ошибку раньше, молодец. 23.11.2016
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]