2017-08-21 6 views
1

私はいくつかの助けを感謝します。私はmongoose(v4.10.5)を使って、expressとmongodb(v3.4.4)でapi restをやっています。私は集約操作を行う必要がありますが、私はそれを処理しません。私はあなたにいくつかのコードを示します。モデル(それはより多くの特性を有しているが、私は単純にそれを残した):モンゴースで集計+母集団を作る方法

const CategoryModel = mongoose.model('Category', new Schema({ 
    slug: { type: String, unique: true, lowercase: true, index: true }, 
    description: String 
})); 

const MyModel = mongoose.model('MyModel', new Schema({ 
    category: { type: Schema.Types.ObjectId, ref: 'Category' }, 
    other: [{ type: Schema.Types.ObjectId, ref: 'Other' }], 
    times_count: { type: Number, default: 0 } 
})); 

重要なのは、私がMyModelの移入categoryフィールド、ないother分野に興味があります。

CategoryMyModelに特定のレコードが整形されているとします。リクエスト:

MyModel.aggregate([ 
    { 
    $group : { 
     _id : '$_id', 
     times: { $sum: '$times_count' } 
    } 
    }, 
    { 
    $limit: 5 
    } 
]).limit(5).exec().then((data) => { 
    console.log(data); 
}).catch((err) => { 
    console.error(err); 
}); 

dataは正しいです、5つのレコードを持っていますが、categoryが含まれていません。今、私は試してみてください。今すぐ

MyModel.aggregate([ 
    { 
    $group : { 
     _id : '$_id', 
     times: { $sum: '$times_count' } 
    } 
    }, 
    { 
    $limit: 5 
    }, 
    { 
    $lookup: { 
     from: 'Category', // I tried with 'Categories' and 'categories' 
     localField: 'category', 
     foreignField: '_id', 
     as: 'category' 
    } 
    }, 
    { 
    $unwind: '$category' 
    } 
]).limit(5).exec().then((data) => { 
    console.log(data); 
}).catch((err) => { 
    console.error(err); 
}); 

dataは空です。私はmongoose.set('debug', true);を設定して、最後の操作aggregateを含めて正しく見える操作を行いますが、データは空です。

私はよく説明してもわかりません。明らかに、私が完全に理解していないことがあります。前もって感謝します。

答えて

1

私はobjsで目的のレコードを取得しますが、問題は私が_idとtimesのプロパティしか持っていないことです。カテゴリを設定する必要があります。

他のコレクションに参加するためにステージを明示的に追加していないので、ほぼ正しいです。

私は$ groupの後に集約に$ projectを追加しようとしましたが、何もしませんでした。

簡潔に言えば、$projectは、1つのコレクションを使用して新しいフィールドを追加したり除外したりするためのものです。

$lookupは、1つのコレクションを別のコレクションに結合するためのものです。新しいコレクションに参加すると、各ドキュメントには、他のコレクションの「結合された」ドキュメントを含む新しい配列フィールドがあります。

あなたの場合、新しい配列フィールドには他のコレクションのドキュメントが1つありますので、おそらく$unwindにもなります。あなたの最初の問題の観点で

MyModel.aggregate([ 
    { 
     $group : { 
      _id : '$_id', 
      times: { $sum: '$times_count' }, 
      category: { $first: '$category' } 
     } 
    }, 
    /* 
    { 
     $limit: 5 
    }, 
    */ 
    { 
     $lookup: { 
      from: 'Categories', 
      localField: 'category', 
      foreignField: '_id', 
      as: 'category' 
     } 
    }, 
    { 
     $unwind: '$category' 
    } 
]).exec(...); 

は、あなたの最初の例ではlimit(5)を使用して、上記ではなく第二段階のコメントを外すしてみてください。

+0

ありがとうございますが、動作していません。 'from: 'Category'、' localField: 'category'などの組み合わせで試してみましたが、配列に '$ limit'を入れました。また、なぜカーソルが必要ですか?わかりません。注目したいフィールドは '_id'ではなく' MyModel'の 'category'です。再度、感謝します。 @ LuisMiguelF。 – lmfresneda

+0

ああ、あなたはそれが「カテゴリー」でなければならないのは間違いありません。私の例のように 'cursor()'は必要ありません。また、[debug on](http://mongoosejs.com/docs/faq.html#enable_debugging)を設定してクエリを確認します。カテゴリスキーマで質問を編集します。 MongoDB v3.2以降も実行していますか? – Mikey

+0

申し訳ありません@Mikey、カーソルは私のせいですが、私はMockgooseの代わりにMongooseを使っています(なぜMockgooseにカーソルが必要なのかわかりませんが)。今、私はモンゴースのみを使用し、私は私の質問を編集します。まだ動作していない... :( – lmfresneda

関連する問題