Ich habe diese Funktion, die nach einem Dokument mit einer gegebenen ID (mID) suchen, prüfen, ob ein anderes Feld existiert (u) und falls nicht, die angegebene ID (uID) hinzufügen.findOneAndUpdate Arbeit in Mongo-Shell, aber nicht mit Node-Mongodb aktualisiert?
Der Code wirft keinen Fehler, aber das Dokument wird auch nicht aktualisiert, aber die Abfrage selbst aus dem gleichen Feld (die zwei console.log
) und die Verwendung in der Mongo-Shell funktioniert.
Das Ergebnis der Abfrage, wenn mit Knoten mongodb-native verwendete { 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();
});
ich auch mit update
und updateOne
Funktionen ausprobiert, aber dasselbe Ergebnis: Befehl Arbeit, nicht den Code.
Kann jemand erklären, warum ein Befehl, der von der Schale funktioniert, nicht funktionieren konnte, wenn er vom Fahrer gemacht wurde, und warum Mongo Bericht ein Dokument fand, aber es nicht aktualisiert?
Knoten v6.9.1, node-mongodb-native v2.2.11
Edit:
Base-Dokument:
{
"_id" : ObjectId("58332c30224fe3273c7b1ba6"),
"mId" : "37286c83-7d81-484d-b62a-310f690cac97"
}
Aktualisiert Dokument:
{
"_id" : ObjectId("58332c30224fe3273c7b1ba6"),
"mId" : "37286c83-7d81-484d-b62a-310f690cac97",
"test" : "f7bb9386-eedd-43fe-890a-348cb3a97ed3"
}
Logger Ausgabe:
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
Die init
Funktion mongoDB, den create
Funktionseinsatz in sie ein neues Dokument mit einem zufälligen mId
anschließen, die link
Funktion übergeben wird. Die UID wird auch zufällig erstellt und ist auch eine UUID.
Während es äquivalent sein sollte, wird der Befehl in der Konsole logs gedruckter:
db.Link.findOneAndUpdate({ mId: 'f8ba93da-3b6d-43f7-9f90-4e345ba04131',
link: { '$ existiert': false}}, { '$ set': {link: ‚f882d44d-60a3 -4701-b5df-ba493c3b249b '}}, {upsert: false});
aktualisiere das Dokument
Sie zeigen das Dokument nicht an, das Sie zu aktualisieren versuchen, aber ich nehme an, dass "mId" und "uId" Zahlen im Dokument sind, aber Zeichenfolgen in Ihrem Code sind. Wenn dies der Fall ist, müssen Sie den Code wie '{mId: parseInt (mId, 10)}' konvertieren. – JohnnyHK
@JohnnyHK: Nein, ich speichere nur UUID (generiert von 'node-uuid'), also sind alles Strings – DrakaSAN
@DrakaSAN - zeigen Sie uns, was ist Logger-Ausgabe.Wir wissen jetzt, welche Parameter vorhanden sind, es gibt einen Fehler. – libik