Какое наиболее чистое решение для запроса данных из двух связанных коллекций?

Мои текущие структуры выглядят так

Посты из коллекции

- PostID
       - titel
       - content
       - titelimgurl
       - tags
       - timestamp

Теперь получить данные здесь легко, я хочу отделить контент от остальных, чтобы мне не приходилось извлекать ненужные данные на моей странице.

Итак, я планирую использовать эту структуру:

Посты из коллекции

- PostID
       - titel
       - titelimgurl
       - tags
       - timestamp

Содержание коллекции

- PostID
       - content

Проблема в том, что я не уверен, как эффективно получить данные, например:

var postRef = db.collection("posts").doc(this.docID);

postRef.get().then(function(doc) {
    if (doc.exists) {
        var contentRef = db.collection("content").doc(doc.id)
        contentRef.get().then(function(doc) {
            ....
         }
    } else {
        // doc.data() will be undefined in this case
        console.log("No such document!");
    }
}).catch(function(error) {
    console.log("Error getting document:", error);
});

Это выглядит чрезмерно сложным, особенно при назначении этих данных фактической коллекции сообщений в моем магазине, и любые идеи о том, как я могу сделать это более эффективным, приветствуются.

Это довольно стандартно для Firestore и NoSQL в целом, поскольку здесь нет операций «соединения».

Doug Stevenson 26.10.2018 09:14

@DougStevenson Хорошо, но как мне узнать, когда более эффективно разделить коллекцию на разные части с точки зрения затрат. (Больше прочтений против более крупных чтений)

Badgy 26.10.2018 10:00

Невозможно сказать, не зная много о данных, которые вы храните. Если вы хотите знать, что является наиболее эффективным, вам необходимо провести сравнительный анализ и измерение ваших данных.

Doug Stevenson 26.10.2018 11:03
0
3
27
1

Ответы 1

Если вы хотите запросить базу данных только один раз, вам не следует денормализовать базу данных, создав этот content как коллекцию верхнего уровня. Вы можете сохранить содержимое сообщения как свойство в документе PostID. В отличие от базы данных реального времени Firebase, где отображается список объектов post, вы бы загрузили весь узел posts, в Cloud Firestore это больше не проблема. Таким образом, вы можете свободно сохранять контент как свойство для выполнения единого запроса.

О, интересно, что это возможно в Firestore, я еще никогда об этом не слышал, у вас есть справочная документация, которую я могу прочитать? Заранее спасибо.

Badgy 26.10.2018 09:41

Боюсь, я вас не понимаю. Но вам следует продолжить с первой схемой базы данных, в которой содержимое является свойством в почтовом документе. При использовании этой опции задействуется только операция чтения.

Alex Mamo 26.10.2018 09:58

Все в порядке, проблема решена?

Alex Mamo 29.10.2018 09:16

Привет, нет, к сожалению, я не смог узнать, как я могу запрашивать только определенные части документа.

Badgy 29.10.2018 09:18

Теперь я понимаю, что вы ищете, но, к сожалению, вы не можете запрашивать только определенные части, весь документ или ничего. Пожалуйста, взгляните на мой ответ из этого Почта для лучшего понимания.

Alex Mamo 30.10.2018 03:54

Да, именно поэтому я был смущен вашим первоначальным ответом, я был уверен, что нет способа запросить его таким образом. Думаю, мне нужно проверить, что дороже с точки зрения затрат: 2 чтения (разделение содержимого из пост-документа в отдельную коллекцию) или чтение всего содержимого каждой страницы. Спасибо за вашу помощь.

Badgy 30.10.2018 07:28

Добро пожаловать, Бэджи! Если вы считаете, что мой ответ вам помог, примите его (✔️) и проголосуйте за (👍). Я бы оценил это. Спасибо!

Alex Mamo 30.10.2018 07:34

Другие вопросы по теме