web-dev-qa-db-ja.com

mongoose findOneの使用方法

私は以下のスキーマを持っています(coffeescriptにあることをおologiesびします)

_Schema = mongoose.Schema

AuthS = new Schema
    auth:   {type: String, unique: true}
    nick:   String
    time:   Date
Auth = mongoose.model 'Auth', AuthS
_

私は単に私のデータベースにある1つのレコードを回復したいだけです:

_Auth.findOne({nick: 'noname'}, function(obj) { console.log(obj); });
_

残念ながら、これは常にnullを記録します。 mongo Shellのdb.auths.findOne({nick: 'noname'})は常に値を返します。何が起こっている?

38
Callum Rogers

問題が見つかりました。代わりにfunction(err,obj)を使用する必要があります。

Auth.findOne({nick: 'noname'}, function(err,obj) { console.log(obj); });
81
Callum Rogers

Mongooseは基本的にmongodbのapiをラップして擬似リレーショナルdb apiを提供するため、クエリはmongodbクエリとまったく同じにはなりません。 MongoosefindOnequeryはクエリオブジェクトを返しますdocumentではありません。ソリューションが示唆するようにコールバックを使用するか、v4 +findOneがthenableを返すため、.thenまたはawait/asyncを使用してドキュメントを取得できます。

// thenables
Auth.findOne({nick: 'noname'}).then(err, result) {console.log(result)};
Auth.findOne({nick: 'noname'}).then(function (doc) {console.log(doc)});

// To use a full fledge promise you will need to use .exec()
var auth = Auth.findOne({nick: 'noname'}).exec();
auth.then(function (doc) {console.log(doc)});

// async/await
async function auth() {
  const doc = await Auth.findOne({nick: 'noname'}).exec();
  return doc;
}
auth();

サードパーティのpromiseライブラリを使用する場合は、 docs を参照してください。

3
Isaac Pak

console.log組み込みの「引数」オブジェクト:

console.log(arguments); // would have shown you [0] null, [1] yourResult

これは、引数の数に関係なく、常にすべての引数を出力します。

2

Obj [0] .nickを使用すると、望ましい結果が得られます。

0
NaturalCoder

私の場合、同じエラーがあります、Asyanc/Await関数を使用しています、これはfindOneにAWAITを追加する必要があるためです

Ex:const foundUser = User.findOne ({ "email" : req.body.email });

上記の場合、findOneは、findOneを終了する前に値を返すため、ユーザーが見つかったかどうかにかかわらず、常にObject値を含みます。

const foundUser = await User.findOne ({ "email" : req.body.email });

上記の条件で、ユーザーがコレクションに存在しない場合、foundUserはnullを返します。ユーザーが見つかった場合、ユーザードキュメントが返されます。

0
Bhagvat Lande