Die Inocmes
und Expenses
Sammlungen verwendet getrennt an vielen Orten in ganz App. Es gibt nur eine Seite, die die folgende Anforderung hat. Ich glaube nicht, gibt es keine Abhilfe in MongoDB, die wirklichZusammenführen von zwei Sammlungen Zeitstempel Daten und zeigt Echtzeit Ergebnis
Ich verwende React-Meteor :(in einem Projekt Millionen von Nutzern haben zwei Sammlung namens Incomes
und Expenses
. Einkommen Doc aussehen wie unten
{
"_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")
}
und unten, wie die Kosten Doc aussehen wie
{
"_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")
}
Jetzt habe ich eine Seite Transaktionen genannt, wo ich alle Transaktions (Einnahmen und Ausgaben) zeigen müssen, basierend auf Zeit so für trans meine Veröffentlichung Code Aktionen siehe unten
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
})
]
});
feine Arbeit alles Bis hier wie bis ich Paginierung auf Transaktions Seite zu implementieren, so dass hier müssen Daten nach Datum sortiert werden. Das ist das wahre Problem. Nehmen wir an, meine beiden Sammlungen haben jeweils 10 Datensätze und meine Vorlagenseite muss die ersten 10 Ergebnisse enthalten, also habe ich 0 und 10 gesendet, im Gegenzug 10 Einnahmen und 10 Aufwandsdatensätze und auf der zweiten Seite gibt es keinen Datensatz, weil überspringen und begrenzen schickte 10 für beide. also wie man damit umgeht? Ich habe auch Technik benutzt, aber das hat nicht funktioniert. Erinnere dich, dass meine Daten auch in Echtzeit sind. jede Hilfe wird sehr geschätzt :)
Sie könnten einfach und tatsächlich Ihr Problem lösen, indem Sie einfach die Sammlungen an erster Stelle "zusammenführen". Wenn ich Sie wäre, würde ich genau das tun und stattdessen einfach einen "Typ" für "Einkommen" und einen für "Aufwand" zu den Artikeln in jeder Sammlung hinzufügen und sie zusammenführen. Abgesehen davon ist das, wonach Sie fragen, eine SQL UNION-Abfrage mit Sortierung und Paging über die "Vereinigung" der Ergebnisse. Es gibt tatsächlich keine MongoDB-Operation, die direkt damit korreliert. Welche Blätter tatsächlich die Sammlungen an ihrer Quelle als die vernünftigste Option zusammenführen, –
Bitte erklären Sie den Begriff "Zusammenführen", indem Sie map reduce || verwenden Aggregat oder einfach nur zwei Sammlungen entfernt und eine einzelne Sammlung vollständig machen? –
Lass mich klarer sein. MongoDB hat keine Methode, um die Daten aus zwei Quellen für die Abfrage in der gewünschten Weise zu verbinden. Sie müssen tatsächlich eine "neue Kollektion" erstellen, die Ihre beiden Kollektionen kombiniert. Also ja. Entferne die beiden und mache eine Single. Dann gibt es kein Problem. –