0

私はmongoose 4.6.3を使用しています。埋め込みドキュメント配列の特定の要素を数えます

私は、次のスキーマを持っている:

var mongoose = require('mongoose'); 
var User = require('./User'); 

var TicketSchema = new mongoose.Schema({ 
    user : { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true }, 
}, 
{ 
    timestamps: true 
}); 

var DrawSchema = new mongoose.Schema({ 
    ... 
    max_ticket_per_user : { type : Number, required: true }, 
    tickets: [TicketSchema] 
}); 

module.exports = mongoose.model('Draw', DrawSchema); 

にはどうすればいいドローのチケットで特定のユーザーのObjectId(TicketSchemaのユーザフィールド)(DrawSchemaでチケットフィールド)の埋め込まれた文書を数えることができますか? 1回の抽選でユーザーのチケットを数えたいと思います。

私のスキーマ設計を変更する方が良いでしょうか?

おかげ

答えて

3

をあなたはどのそれぞれのユーザーIDとその大きさに一致する要素を持つフィルタ配列を取得するために$filter$size事業者を利用して、集約フレームワークを使用することができますその後あなたにカウントを与えます。単一の描画のために

、コレクション内の文書をフィルタリングする_idクエリを使用して最初のステップとして$matchパイプライン演算子を追加することを検討してください。

Draw.aggregate([ 
    { "$match": { "_id": drawId } }, 
    { 
     "$project": { 
      "ticketsCount": { 
       "$size": { 
        "$filter": { 
         "input": "$tickets", 
         "as": "item", 
         "cond": { "$eq": [ "$$item.user", userId ] } 
        } 
       } 
      } 
     } 
    } 
]).exec(function(err, result) { 
    console.log(result); 
}); 
+0

素晴らしい答え。私は必要な情報を取得しますが、私は与えられたIDで描画を集約したいだけです。 – AlexB

+0

私が応答として得るのは、すべてuserIdのカウントを持つidです。私は単一の描画IDで集計したいだけです – AlexB

+0

@AlexB上記の更新で示したように、ドキュメントをフィルタリングするために$一致のパイプラインクエリが必要です。 – chridam

1

あなたは、他のクエリオブジェクトのように.count()深いパラメータを渡すことができます。

Draw.count({'tickets.user._id' : userId}, console.log); 

はuserIdを変数のObjectIdであることを確認してください。それは文字列だ場合は、この操作を行います。

const ObjectId = require('mongoose').Types.ObjectId; 
let userId = new ObjectId(incomingStringId); 
+2

これは、特定の引き分けのために動作しないでしょう。

は、所望の結果を得るために、以下の集約パイプラインを実行することを検討してください。私は "_id"を追加しようとします:drawId – AlexB

関連する問題