2017-05-02 16 views
0

Mongooseを使用して、ユーザーのプロファイルを設定するための情報を返したいとします。私はfindOneを使用して、埋め込まれたドキュメントと.populateを使って、基本的なプロファイル情報とともに、コメントのリストを作成してきました。友人の配列に含まれるオブジェクトの数を数えて、自分が所有している友人の数を取得したいと思います。mongooseスキーマ配列フィールドのfindOne内でカウントされる

これは集約のようなものですが、どうすれば両方使うことができますか?またはfindOneクエリでカウントを行う簡単な方法はありますか?

var UserSchema = new Schema({ 
 
    username: String, 
 
    comments  : [{ type: Schema.Types.ObjectId, ref: 'Comment' }], 
 
    friends: [ 
 
\t \t \t \t \t { 
 
\t \t \t \t \t \t id: { type: Schema.Types.ObjectId, ref: 'User' }, 
 
\t \t \t \t \t \t permission: Number 
 
\t \t \t \t \t } 
 
    ] 
 
}) 
 
    
 
var User = mongoose.model('User', UserSchema); 
 
var Comment = mongoose.model('Comment', CommentSchema); 
 

 
app.get('/profile/:username', function(req, res) { 
 
User 
 
.findOne({ username: req.params.username }, 'username friends -_id') 
 
\t .populate({ 
 
\t \t path: 'current', 
 
\t \t model: 'Comment', 
 
\t \t select: 'comment author -_id date', 
 
\t \t populate: { 
 
\t \t \t path: 'author', 
 
\t \t \t model: 'User', 
 
\t \t \t select: 'username firstName lastName -_id' 
 
\t \t } 
 
\t }) \t 
 
.exec(function(err, user) { 
 
// 
 
}) 
 
)}

+0

を使用し、カウントしたい場合は? –

答えて

0

ユーザーはあなただけuser.friends.length返さない理由は、友人の配列、と返された場合は?

あなただけuser.friends.lengthを使用していないのはなぜこの

User.aggregate([ 
    { 
     $match: { username: req.params.username } 
    }, 
    { 
     $unwind: "$comments" 
    }, 
    { 
     $lookup: { 
      from: "Comment", 
      localField: "comments", 
      foreignField: "_id", 
      as: "comments" 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$_id", 
      "friends": { "$first": "$friends"}, 
      "comments": { "$push": "$comments" } 
     } 
    }, 
    { 
     $project: { 
      _id: 0, 
      count: {$size: '$friends'}, 
      comments: 1, 
      username: 1 
     } 
    } 
]).exec() ... 
+0

私はカウントが必要なときにたくさんのエンジェルを持っているなら、私は巨大な配列を返すだろうから。埋め込まれたドキュメントのために.populateを使ってfindOneを使用して私が読んでいるのであればどうしますか?私は同じことを行うために集約を使うことができますか?またはそれらを組み合わせることはできますか? – totalnoob

+0

まあ、集計でpopulateメソッドを使用することはできません。代わりに、lookupメソッドを使用してコメントオブジェクトを取得する必要があります。私は自分の答えを更新しました。検索の検索、アンワインド、グループ化に関するドキュメント:https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/ –

+0

また、私はあなたの編集された答えを見ました。集計は必要ないかもしれないようです。あなたが友人コレクションを設定しない限り、OKのオブジェクトIDリストの配列を返します。その長さを返すことができます。それでもオブジェクトIDリストを返すことを望まない場合は、集計をビューまたはすべてのスキーマをテストすることができないので、ビルドに時間がかかることがある集計を使用する必要があります。 –

関連する問題