Mongoose: FindOneは、存在しないフィールドのデフォルト値を返します。

作成日 2016年07月23日  ·  3コメント  ·  ソース: Automattic/mongoose

_最初:この問題を克服するための回避策:_
Model.findOne({id: 'blabla'}).select('email password createdAt').lean().exec()

問題:

UsersモデルでcreatedAtフィールド(有効期限(TTL 24h )とデフォルト( Date.now )の値)を使用して、作成を保存します新しく作成されたユーザーの日付情報。

ユーザーがアカウントをアクティブ化すると、システムはcreatedAtフィールドを削除します。
ユーザーがアカウントをアクティブ化しない場合、システムは24時間後にUsersコレクションからアカウントを削除します。

認証操作では、最初にcreatedAtフィールドの存在を確認します。
ユーザーがアクティブ化されていない場合、 Account is not activated.ようなメッセージが表示されます

上記の認証手順の目的でFindOneメソッドを試すと、ユーザーが自分のアカウントをアクティブ化したため、ドキュメントにcreatedAtフィールドがないにもかかわらず、 Date.now値が取得されます。 。

createdAt UserモデルのcreatedAtフィールド:
createdAt: { type: Date, expires: '24h', default: Date.now },

私の方法:
Users.findOne({email: username}, 'email, password, createdAt', function(err, user) {

上記のメソッドを使用すると、 createdAt値が毎回返されます。

ps:問題を検索しましたが、何もできませんでした。

最も参考になるコメント

同じ問題に遭遇しました。
@ vkarpov15それはそのようにfindのときに設定すると誤解を招きますね。 私は問題を再開することに投票します。

全てのコメント3件

これがデフォルトの仕組みです。ドキュメントにcreatedAtフィールドがない場合、マングースは1つ追加します。 新しいドキュメントを作成するときにcreatedAtのみを追加する場合:

schema.pre('save', function(next) {
  if (this.isNew) {
    this.createdAt = Date.now();
  }
  next();
});

また、プロジェクションUsers.findOne({email: username}, 'email, password, createdAt' /** <-- remove commas here */)のフィールドをコンマで区切ることはお勧めしません。

同じ問題に遭遇しました。
@ vkarpov15それはそのようにfindのときに設定すると誤解を招きますね。 私は問題を再開することに投票します。

必ずしもそうとは限りませんが、マングースには、データベースに格納されている正確なデータをドキュメントが表していない場所がたくさんあります。ゲッター、仮想などです。いずれにせよ、この動作を主張し、変更すると多くの人のコードが破損するためです。変更する必要がない限り、変更しません。 回避策は次のとおりです。

createdAt: {
  type: Date,
  default: function() {
    if (this.isNew) { return new Date(); }
    return undefined;
  }
}

これにより、 createdAtはデータベースに保存するときにのみ設定されるようになりますが、データベースからドキュメントをロードし、 createdAtがロードされていない場合は、 undefinedます。設定。

このページは役に立ちましたか?
0 / 5 - 0 評価