findOneAndUpdate在mongo shell中工作,但不用node-mongodb更新?

时间:2016-11-18 17:42:08

标签: node.js mongodb node-mongodb-native

我有这个函数,它搜索具有给定ID(mID)的文档,检查是否存在另一个字段(u),如果不存在,则添加给定的id(uID)。

代码不会抛出任何错误,但也不会更新文档,但是,我自己从同一个字段(两个console.log)构建查询并在mongo shell中使用它们确实有效。

与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();
});

我也尝试过使用updateupdateOne函数,但结果相同:命令工作,而不是代码。

任何人都可以解释为什么从shell开始工作的命令在从驱动程序生成时无法工作,为什么Mongo报告它找到了一个文档,但是不更新它?

node v6.9.1,node-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',

link:{'$ exists':false}},{'$ set':{link:'f882d44d-60a3-4701-b5df-ba493c3b249b'}},{upsert:false});

更新文档

1 个答案:

答案 0 :(得分:0)

嗯,你使用了错误的收藏品名称

当您插入一个时,使用大写链接

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

当您尝试更新时,您使用的是小写链接

Link.collection('link') <<<<<<<<<<<<<<<<<
    .findOneAndUpdate(