Хранение тегов в Firebase из запроса POST для другой коллекции в Node.js - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть две коллекции, posts и tags. posts содержит postId и другие метаданные, включая tags. Вот как будет выглядеть post:

{
    "tags": [
        "tag1",
        "tag2",
        ...
    ],
    "message": "test message"
    ...
}

Возвращает пост выше с postId.

Используя Ax ios, я получаю эти данные в своей функции. Я хочу взять каждый тег, поместить его в коллекцию tags вместе с postId, связанным с ним.

Пример коллекции tags:

tags: {
    tag1: {
        "postId1",
        "postId2"
    },
    tag2: {
         "postId1",
         "postId3"
    }
}

Я застрял, добавляя теги к своей собственной коллекции в Firebase, и я попытался использовать тег forEach и обновить tags коллекция одна за другой, но это не работает для меня.

Код, который у меня сейчас есть:

  db.collection("posts")
    .add(oneNewPost)
    .then((doc) => {
      // add the post body to the "posts" collection
      const resPost = oneNewPost;
      resPost.postId = doc.id;
      res.json(resPost);
    })
    .then(() => {
      // DOESNT WORK HERE --> overwrites changes in firebase "tags" collection
       let batch = db.batch();
      resPost.tags.forEach((doc) => {
        const docRef = db.collection("tags").doc(doc);
        batch.update(docRef, { postId: resPost.postId }, { merge: true });
      });
      batch.commit().then(() => {
        return res.json({...resPost});
      });
    })
    .catch((err) => {
      res.status(500).json({ error: "something went wrong" });
      console.error(err);
    });

Пожалуйста, дайте мне знать, если что-то неясно!

1 Ответ

0 голосов
/ 11 апреля 2020

Я заставил его работать, используя следующий код:

 .then((resPost) => {
      // add postId's to tag collection here
      let batch = db.batch();
      resPost.tags.forEach((doc) => {
        const docRef = db.doc(`/tags/${doc}`);
        batch.update(
          docRef,
          { postId: admin.firestore.FieldValue.arrayUnion(resPost.postId) },
          { merge: true }
        );
      });
      batch
        .commit()
        .then(() => {
          return res.json({ ...resPost });
        })
        .catch((err) => {
          console.error(err);
          return res.status(500).json({ error: err.code });
        });
    })

По сути, вам необходимо выполнить пакетное обновление, но также указать c FieldlValue для каждого postId.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...