findOneAndUpdate 在 mongo shell 中工作,但不使用 node-mongodb 更新?
findOneAndUpdate work in mongo shell, but doesn't update with node-mongodb?
我有这个功能,它搜索具有给定 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();
});
我也尝试使用 update
和 updateOne
函数,但结果相同:命令有效,而不是代码。
任何人都可以解释为什么从 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
的新文档,并传递给 [=24] =] 函数。
uId也是随机创建的,也是一个UUID。
虽然应该是等效的,但控制台日志中打印的命令:
db.Link.findOneAndUpdate({ mId: 'f8ba93da-3b6d-43f7-9f90-4e345ba04131',
link: { '$exists': false } }, { '$set': { link: 'f882d44d-60a3-4701-b5df-ba493c3b249b' } }, {upsert: false});
更新文档
嗯,你用错了Collection名字
当你插入一个时,你使用大写 Link
Link.collection('Link') <<<<<<<<<<<<<<<<<<<<
.insertOne({'mId': mId})
当您尝试更新时,您使用的是小写 link
Link.collection('link') <<<<<<<<<<<<<<<<<
.findOneAndUpdate(
我有这个功能,它搜索具有给定 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();
});
我也尝试使用 update
和 updateOne
函数,但结果相同:命令有效,而不是代码。
任何人都可以解释为什么从 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
的新文档,并传递给 [=24] =] 函数。
uId也是随机创建的,也是一个UUID。
虽然应该是等效的,但控制台日志中打印的命令:
db.Link.findOneAndUpdate({ mId: 'f8ba93da-3b6d-43f7-9f90-4e345ba04131',
link: { '$exists': false } }, { '$set': { link: 'f882d44d-60a3-4701-b5df-ba493c3b249b' } }, {upsert: false});
更新文档
嗯,你用错了Collection名字
当你插入一个时,你使用大写 Link
Link.collection('Link') <<<<<<<<<<<<<<<<<<<<
.insertOne({'mId': mId})
当您尝试更新时,您使用的是小写 link
Link.collection('link') <<<<<<<<<<<<<<<<<
.findOneAndUpdate(