Inocmes
とExpenses
のコレクションはアプリ全体で多くの場所で別々に使用されています。以下の要件を持つページは1つだけです。私は実際に何百万ものユーザーを持つ、MongoDBのには回避策はありません信じていません:(2つのコレクションをマージしてタイムスタンプを付けたデータを表示し、リアルタイム結果を表示
私は、プロジェクトで反応-流星を使用していますIncomes
とExpenses
という名前の2つのコレクションを持っている。
{
"_id" : "euAeJYArsAyFWLJs6",
"account" : "3m5Zxsije9b6ZaNpu",
"amount" : 3,
"receivedAt" : ISODate("2017-07-07T06:21:00.000Z"),
"type" : "project",
"project" : {
"_id" : "ec2WLt3GzHNwhK7oK",
"name" : "test"
},
"owner" : "nM4ToQEbYBsC3NoQB",
"createdAt" : ISODate("2017-07-07T06:21:37.293Z")
}
と費用ドクは、今私は、私はすべてのトランザクション(収入と支出)を示さなければならない取引と呼ばれるページを持っている
{
"_id" : "snWDusDbkLHHY2Yry",
"account" : "3m5Zxsije9b6ZaNpu",
"amount" : 4,
"spentAt" : ISODate("2017-07-07T06:21:00.000Z"),
"description" : "4",
"category" : {
"_id" : "vh593tw9dZgNdNwtr",
"name" : "test",
"icon" : "icon-icons_tution-fee"
},
"owner" : "nM4ToQEbYBsC3NoQB",
"createdAt" : ISODate("2017-07-07T06:22:04.215Z")
}
どのように見えるか、以下のトランスのためので、私の出版コード私はここに、トランザクションページにページネーションを実装する必要があり、データが日付でソートする必要があるまで、アクションはすべてのものの作業罰金ここティル
import { Meteor } from 'meteor/meteor';
import { Incomes } from '../../incomes/incomes.js';
import { Expenses } from '../../expences/expenses.js';
import { Counter } from 'meteor/natestrauser:publish-performant-counts';
let datefilter = (options, query) => {
let dateQuery = {$gte: new Date(options.dateFilter.start), $lte: new Date(options.dateFilter.end)};
let temp = {$or: [{receivedAt: dateQuery}, {spentAt: dateQuery}]};
query.$and.push(temp);
};
Meteor.publish('transactions', function(options) {
let query = {
owner: this.userId,
$and: []
};
if(options.accounts.length)
query['account'] = {$in: options.accounts};
options.dateFilter && datefilter(options, query);
//here i also apply other filter based on category and project which does not matter so i removed
if(!query.$and.length) delete query.$and;
//computing 'Transactions' below
return [
Incomes.find(query, {
sort: {
receivedAt: -1
},
limit: options.limit,
skip: options.skip
}),
Expenses.find(query, {
sort: {
spentAt: -1
},
limit: options.limit,
skip: options.skip
})
]
});
以下のように見えます。それが本当の問題です。私の両方のコレクションにはそれぞれ10レコードあり、テンプレートページには最初の10の結果が含まれていると仮定して、スキップ0と制限10を返すため、10の収入と10の費用レコードが返され、2ページ目にスキップとリミット両方のために10を送った。どのようにそれに対処するには?私はカウンターテクニックも使用しましたが、うまくいきませんでした。私のデータもリアルタイムであることを忘れないでください。 任意のヘルプは大歓迎されます:)
からの結果は、あなたは、単に、実際に単に最初の場所でコレクションを「マージ」で、あなたの問題を解決することができます。私があなただったら、私はまさにそれを行うには、代わりに単に各コレクション内の項目に「費用」の「利益」のための「タイプ」と1を追加し、それらをマージします。それ以外では、何を求めていることは、結果の「労働組合」の上にソートやページングとSQL UNIONクエリのようなものです。実際にこれに直接関係するMongoDB操作はありません。実際には、ほとんどのまともなオプションとしてそのソースでコレクションをマージ残す、 –
はマップが削減使用して、「マージ」という用語を説明してください||集計するか、2つのコレクションを削除して、1つのコレクションを完全に作成しますか? –
私はもっとわかります。 MongoDBは、あなたが望む方法で、クエリのための2つのソースからのデータをマージする方法はありません。両方のコレクションを組み合わせた「新しいコレクション」を実際に作成する必要があります。そう、はい。2人を取り除き、1人にする。それで問題はない。 –