2016-11-18 1 views
0

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

+0

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

+0

@JohnnyHK: Nein, ich speichere nur UUID (generiert von 'node-uuid'), also sind alles Strings – DrakaSAN

+0

@DrakaSAN - zeigen Sie uns, was ist Logger-Ausgabe.Wir wissen jetzt, welche Parameter vorhanden sind, es gibt einen Fehler. – libik

Antwort

0

Nun, Sie verwenden falsche Name der Sammlung

Wenn Sie ein Einfügen verwenden Sie Groß Link-

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

Wenn Sie versuchen, Sie zu aktualisieren verwenden Kleinbuchstaben Link

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

100pts ist eine gerechte Strafe dafür, dass du so einen kleinen Fehler früher nicht gesehen hast, gute Arbeit für dich. – DrakaSAN

+0

Danke .. froh zu helfen ... –

Verwandte Themen