Я использую nodejs с mongodb.
В настоящее время наша команда создает простое приложение для сообщества Android.
Поскольку я серверный программист, я хочу знать, есть ли лучшие способы обработки базы данных с помощью mongodb.
На картинке выше показано наше приложение. Когда пользователь щелкает статью (левое изображение), приложение перемещается на страницу статьи с содержанием статьи (знак ① на правом изображении) и комментариями к статье (знак ② на правом изображении).
Мы успешно создали это приложение. Но возникла серьезная проблема: медленное время отклика
Приложение передает данные через каждые два POST API.
Один - / selectBoardArticle, который загружает содержимое статьи, а другой - / selectCommentList, который загружает полные комментарии к статье.
Требуется запросить данные статьи.
Один разработчик сказал, что два запроса вызывают чрезмерное время отклика. Поэтому я пытаюсь интегрировать / selectBoardArticle и / selectCommentList API.
Я знаю два варианта интеграции данных двух коллекций.
Во-первых, используя функцию db.collection.aggregate.
Это исходный код / selectBoardArticle API
app.post('/selectBoardArticle', util.session, function (req, res) {
TN_BBS.find({bbs_id: req.body.bbs_id, ntt_id: req.body.ntt_id, use_at: "Y"}).exec(function (err, result) {
if (result.length) {
//increase read count and save
result[0].rdcnt++;
result[0].save(function () {
//join comment(TN_COMMENT) and image(TN_FILEDETAIL) data of the article
TN_BBS.aggregate([{
"$lookup": {
from: "TN_COMMENT",
localField: "ntt_id",
foreignField: "ntt_id",
as: "COMMENT"
}
}, {
"$lookup": {
from: "TN_FILEDETAIL",
localField: "atch_file_id",
foreignField: "atch_file_id",
as: "TN_FILEDETAIL"
}
}, {
"$match": {
ntt_id: req.body.ntt_id,
bbs_id: req.body.bbs_id
}
}]).limit(1).exec(function (err, result) {
if (err) {
return res.send(err);
}
res.end(JSON.stringify(result[0]));
setPopPoint(req.body.ntt_id);
})
});
}
else
res.end("no result!");
});
Во-вторых, найдите каждую статью и данные комментария и вставьте данные комментария в данные статьи с помощью javascript.
router.get('/selectBoardArticles/:bbs_id', function (req, res) {
var query = {bbs_id: req.params.bbs_id, use_at: "Y"};
TN_BBS.find(query, function (err, doc) {
if (err) {
return res.send(err);
}
var ntt_ids = [];
for (var i = 0; i < doc.length; i++) {
ntt_ids.push(doc[i].ntt_id);
}
TN_COMMENT.find({bbs_id: req.params.bbs_id, ntt_id: {$in: ntt_ids}}, function (err, doc2) {
for (var i = 0; i < doc.length; i++) {
doc[i].comment = [];
for (var j = 0; j < doc2.length; j++)
if (doc2[j].ntt_id == doc[i].ntt_id) doc[i].comment.push(doc2[j]);
}
res.render('admin/board_articles', {data: doc, length: doc.length, boardMaster: req.params.bbs_id});
});
});
Хотя этот API возвращает список статей, я хочу сказать, что он дважды находит и вставляет дочерние данные через javascript.
Я обнаружил несколько проблем, связанных с объединением коллекций.
Я чувствую, что использовать mongodb в качестве реляционной базы данных не рекомендуется.
The idea behind MongoDB is to eliminate (or at least minimize) relational data. https://stackoverflow.com/a/8129650/5593805
Если я правильно понял, мне не следует присоединяться к коллекциям.
Но я никак не мог найти способ избежать пополнения коллекций.
Стоит ли объединять две коллекции в одну?
Когда кто-то часто использует агрегацию в mongodb, я думаю, что лучше использовать реляционную базу данных.
Я хочу знать, что вы думаете об этом.
Чтобы объединить две коллекции в mongodb.
Мне нужно писать действительно сложный код по сравнению с реляционной базой данных.
В частности, mongodb нужен действительно длинный и сложный запрос на соединение, который можно легко и интуитивно выполнить в mysql с запросом JOIN, что плохо для обслуживания.
Я хочу знать, есть ли лучшие и эффективные способы объединения двух коллекций в mongoDB в nodejs?
Похоже, вы пытаетесь использовать Mongo там, где вам нужна реляционная база данных, и в этом случае: рассматривали ли вы реляционную базу данных?





Было бы лучше, если бы вы разместили подборку образцов и желаемый результат вместо этой истории ...