通过键名获取值mongodb node.js驱动程序

我已经看过每一个地方,无法find是否可以做我试图返回一个对象的所有值,只通过它的键名search。 我的文档看起来像这样。

{ "_id": ObjectID("5636e00c09431db4560ef063"), "username": "example@web.com", "credentials": { "password": "e5e0ba4ce8ae13d1d0291e98d9a62b4d68f1db737a36a9373f916185157500cc", "randomSalt": "00dfb37635ba7e5a513f9fd6e8bdf746f85ec3571df8288e1fdb44f399e331f0" } } 

使用本机node.js驱动程序执行此操作时有一种快速简单的方法

我的代码到目前为止

 function getUserLoginFromDatabase(username, callback) { mongodb.connect(url, function(err, db) { if(err) { callback(err); db.close(); return; } var collection = db.collection(username); collection.find({},{"credentials":1}, function(err, result) { console.log(result); callback(err, result); db.close(); }); }); }; 

更新离开什么Alok Deshwal说做我得到这个。 我使用的是mongodb v3.0.7,如果这有所作为。

 function getUserLoginFromDatabase(username, callback) { mongodb.connect(url, function(err, db) { if(err) { callback(err); db.close(); return; } var collection = db.collection(username); collection.find({},{"credentials":1,"_id":0,"username":0}, function(err, result) { console.log(result); callback(err, result); db.close(); }); }); }; 

产量

 Readable { connection: null, server: null, disconnectHandler: { s: { storedOps: [], storeOptions: [Object], topology: [Object] }, length: [Getter] }, bson: {}, ns: 'mydb.exsample@web.com', cmd: { find: 'mydb.exsample@web.com', limit: 0, skip: 0, query: {}, slaveOk: true, readPreference: { preference: 'primary', tags: undefined, options: undefined }, fields: { credentials: 1, _id: 0, username: 0 } }, options: { skip: 0, limit: 0, raw: undefined, hint: null, timeout: undefined, slaveOk: true, readPreference: { preference: 'primary', tags: undefined, options: undefined }, db: EventEmitter { domain: null, _events: {}, _eventsCount: 0, _maxListeners: undefined, s: [Object], serverConfig: [Getter], bufferMaxEntries: [Getter], databaseName: [Getter], options: [Getter], native_parser: [Getter], slaveOk: [Getter], writeConcern: [Getter] }, promiseLibrary: [Function: Promise], disconnectHandler: { s: [Object], length: [Getter] } }, topology: EventEmitter { domain: null, _events: { reconnect: [Function], timeout: [Object], error: [Object], close: [Function], destroy: [Object] }, _eventsCount: 5, _maxListeners: undefined, s: { options: [Object], callbacks: [Object], logger: [Object], state: 'connected', reconnect: true, reconnectTries: 30, reconnectInterval: 1000, emitError: true, currentReconnectRetry: 30, ismaster: [Object], readPreferenceStrategies: undefined, authProviders: [Object], id: 1, tag: undefined, disconnectHandler: [Object], wireProtocolHandler: {}, Cursor: [Object], bsonInstance: {}, bson: {}, pool: [Object], serverDetails: [Object] }, name: [Getter], bson: [Getter], wireProtocolHandler: [Getter], id: [Getter] }, cursorState: { cursorId: null, cmd: { find: 'mydb.exsample@web.com', limit: 0, skip: 0, query: {}, slaveOk: true, readPreference: [Object], fields: [Object] }, documents: [], cursorIndex: 0, dead: false, killed: false, init: false, notified: false, limit: 0, skip: 0, batchSize: 1000, currentLimit: 0, transforms: undefined }, callbacks: null, logger: { className: 'Cursor' }, _readableState: ReadableState { objectMode: true, highWaterMark: 16, buffer: [], length: 0, pipes: null, pipesCount: 0, flowing: null, ended: false, endEmitted: false, reading: false, sync: true, needReadable: false, emittedReadable: false, readableListening: false, defaultEncoding: 'utf8', ranOut: false, awaitDrain: 0, readingMore: false, decoder: null, encoding: null }, readable: true, domain: null, _events: {}, _eventsCount: 0, _maxListeners: undefined, s: { numberOfRetries: 5, tailableRetryInterval: 500, currentNumberOfRetries: 5, state: 0, streamOptions: {}, bson: {}, ns: 'mydb.exsample@web.com', cmd: { find: 'mydb.exsample@web.com', limit: 0, skip: 0, query: {}, slaveOk: true, readPreference: [Object], fields: [Object] }, options: { skip: 0, limit: 0, raw: undefined, hint: null, timeout: undefined, slaveOk: true, readPreference: [Object], db: [Object], promiseLibrary: [Function: Promise], disconnectHandler: [Object] }, topology: EventEmitter { domain: null, _events: [Object], _eventsCount: 5, _maxListeners: undefined, s: [Object], name: [Getter], bson: [Getter], wireProtocolHandler: [Getter], id: [Getter] }, topologyOptions: { socketOptions: {}, auto_reconnect: true, host: 'localhost', port: 27017, cursorFactory: [Object], reconnect: true, emitError: true, size: 5, disconnectHandler: [Object], bson: {}, messageHandler: [Function], wireProtocolHandler: {} }, promiseLibrary: [Function: Promise], currentDoc: null }, timeout: false, sortValue: undefined, readPreference: { preference: 'primary', tags: undefined, options: undefined } } 

你可以做这样的事情,只为了获得现有的凭据。

var res = []; db.collection.find({credentials : {$exists:true}}).forEach(function(document){ res.push(document.credentials})

然后你可以callback数组: callback(err, res)

这对你有帮助吗?

好吧,基于我原来的想法是正确的方式,我可以通过将其投入数组来实现我的输出。 你只需要"credentials":1只抓取证书,并包括"credentials":1,"_id":0,"username":0由Alok Deshwal告诉导致mongodb抛出一个错误。

 function getUserLoginFromDatabase(username, callback) { mongodb.connect(url, function(err, db) { if(err) { callback(err); db.close(); return; } var collection = db.collection(username); collection.find({},{"credentials":1}).toArray(function(err, result) { callback(err, result); db.close(); }); }); }; 

但是,在使用数据的callback中,它变得单调乏味,因为它应该不在数组中。 我会问另外一个关于这个问题,以及为什么包括更多的领域导致mongodb抛出一个错误。

 randomSalt = result[0]["credentials"].randomSalt; userStoredPassword = result[0]["credentials"].password; 

这个答案的结论也在这里

如果你想通过键名search,你可以使用$ exist操作符

 db.collection.find({},{"credentials":1,"_id":0,"username":0}) 

使用"keyname":0从结果中排除, "keyname":1包含在结果中