2016-09-02 9 views
0

ES2015で標準化されたJavascriptのSetを、一意性のためにMongooseのSchemaTypeとして使用したいと考えています。しかし、MongooseのドキュメントはSetを明示的にサポートしていませんが、 "Mixed"タイプは一般的な "anything goes"タイプ(http://mongoosejs.com/docs/schematypes.html)のようです。MongooseスキーマタイプとしてJavascript Setを使用しますか?

平均的なReddit/Hacker NewsチュートリアルThinkster.ioに基づいて私のWebアプリケーションで "Mixed"を試みましたが、バグがありました。私はセットでupvoteをクリックしたすべてのユーザーを保存します。しかし、upvoteをクリックするのは初めてです。 upvoteを最初にクリックした後、ページがリフレッシュされると、upvoteカウントは0にリセットされ、upvoteをクリックしても機能しなくなります。私はいくつかのconsole.loggingを行い、初めてアップウィートが新しいSet()に正しく設定されていることを発見しました。しかし、ページをリフレッシュしたりupvoteをクリックしたりすると、setオブジェクトはより一般的な[objectオブジェクト]にリセットされ、addとsetの長さは機能しません。何か助けてくれてありがとう!

Posts.js:

var mongoose = require('mongoose'); 

    var PostSchema = new mongoose.Schema({ 
     title: String, 
     link: String, 
     upvotes: {type: Number, default: 0}, 
     comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }], 
     author: String, 
     upvoters: Object 
    }); 

    PostSchema.methods.upvote = function(cb, upvoter) {   
     if(this.upvoters == null){ 
     this.upvoters = new Set(); 
     } 
     this.upvoters.add(upvoter); 
     this.markModified('upvoters'); 
     this.upvotes = this.upvoters.length; 
     this.save(cb); 
    }; 
    mongoose.model('Post', PostSchema); 

答えて

1

私はObjectはマングースに有効なスキームのタイプではありません信じています。

また、ES6のSetは、Objectの代わりにArrayとよく似ています。それはどちらか動作しない場合

[{type : mongoose.Schema.Types.ObjectId, ref : 'User'}]

upvotersのスキーマタイプを変更してみてください、私はあなたがより良いマングースモデルオブジェクトに直接割り当てるのではなく、変数にnew Set()を初期化すると思うようなもの:(テストされていません)

PostSchema.methods.upvote = function(cb, upvoter) { 
    var upvoters = new Set(this.upvoters); 
    upvoters.add(upvoter); 
    this.upvoters = Array.from(upvoters); 
    this.markModified('upvoters'); 
    this.save(cb); 
}; 

はまた、私はあなたがこれを達成するためにSchema.virtualを使用して検討することもでき、その値は常にupvoters.lengthに等しいはずなので、あなたは、プロパティupvotesを削除することをお勧め。

+0

ありがとうございました!あなたのコードは動作しますが、セットと配列の両方を使用して2と3の間で前後に変換するのは大きなパフォーマンスの低下ですか? – CarlGammaSagan

+0

私はパフォーマンスについて多くのことを研究していないので、良い記事を見つけたかどうか教えてください。ちなみに、mongooseオブジェクトやmongoose ObjectIdを追加するときに 'Set#add'は動作しますか? 'upvoter'を同じにして' upvote() 'を起動すると、重複した値がありますか? – kitlee

関連する問題