【问题标题】:How to only send Algolia specific fields from a document in Firestore如何仅从 Firestore 中的文档发送 Algolia 特定字段
【发布时间】:2021-04-15 18:49:51
【问题描述】:

我是使用 Algolia 的新手。我正在尝试从我的 Firestore 将用户数据发送到 Aloglia,以便稍后在我正在创建的应用程序中搜索它们。我已经成功设置了一切,我的所有功能都通过 Firebase 云功能工作。因此,当我在 Firestore 中为“用户”创建文档时,它会将所有字段传递给 Algolia,更新和删除这些数据也体现在 Algolia 中。

但是,为了维护安全,我不想将所有用户数据发送到 Algolia,而只想发送几个字段。其中包括“displayName”和“username”(“users”集合中的两个字段)。

所以我的问题是如何更改我的代码以仅将这两个字段发送到 Algolia? 请同时提供删除和更新的答案。

我的代码:

const functions = require("firebase-functions");
const admin = require('firebase-admin');
const algoliasearch = require('algoliasearch');

const ALGOLIA_APP_ID = "MY KEY";
const ALGOLIA_ADMIN_KEY = "MY KEY";
const ALGOLIA_INDEX_NAME = "users";

var client = algoliasearch(ALGOLIA_APP_ID, ALGOLIA_ADMIN_KEY);


admin.initializeApp(functions.config().firebase);

exports.createUser = functions.firestore
.document('users/{userID}')
.onCreate( async (snap, context) => {
    const newValue = snap.data();
    newValue.objectID = snap.id;

    var index = client.initIndex(ALGOLIA_INDEX_NAME);
    index.saveObject(newValue);
});

exports.updateUser = functions.firestore
    .document('users/{userID}')
    .onUpdate( async (snap, context) => {
        const afterUpdate = snap.after.data();
        afterUpdate.objectID = snap.after.id;
        
        var index = client.initIndex(ALGOLIA_INDEX_NAME);
        index.saveObject(afterUpdate);
    })

exports.deleteUser = functions.firestore
    .document('users/{userID}/')
    .onDelete( async (snap, context) => {
        const oldID = snap.id;

        var index = client.initIndex(ALGOLIA_INDEX_NAME);
        index.deleteObject(oldID);
    });

【问题讨论】:

    标签: javascript firebase google-cloud-firestore algolia


    【解决方案1】:

    Algolia 有一些关于如何对索引执行添加、更新和删除操作的 good documentation。请注意,添加和更新您需要传递objectID

    仅添加某些字段

    使用您示例中的一些代码,您可以仅将 Firestore 对象的某些字段传递给 Algolia (example from docs):

    exports.createUser = functions.firestore
        .document("users/{userId}")
        .onCreate((snap, context) => {
            const newValue = snap.data();
            const user = {
                objectID: context.params.userId,
                displayName: newValue.displayName,
                username: newValue.username,
            };
    
            return index.saveObject(user);
        });
    

    仅更新某些字段

    同样受到an example in the docs的启发:

    exports.updateUser = functions.firestore
        .document("users/{userId}")
        .onUpdate(async (snap, context) => {
            const afterUpdate = snap.after.data();
            const updateUser = {
                objectID: context.params.userId,
                displayName: afterUpdate.displayName,
                username: afterUpdate.username,
            };
    
            await index.partialUpdateObject(updateUser);
        });
    

    删除

    delete by filters 是可能的,尽管我没有这样做,文档指出您应该改用 deleteObject 方法,因为它更高效。你可以这样做:

    exports.deleteUser = functions.firestore
        .document("users/{userId}")
        .onDelete((snap) => {
            return index.deleteObject(snap.id);
        });
    

    【讨论】:

      猜你喜欢
      • 2020-11-08
      • 1970-01-01
      • 2018-09-04
      • 2019-04-10
      • 1970-01-01
      • 2020-08-01
      • 2018-04-11
      • 1970-01-01
      相关资源
      最近更新 更多