如何在Firebase Cloud函数中查询对象数组,以获取匹配对象,然后进行更新

如何在Firebase Cloud函数中查询对象数组,以获取匹配对象,然后进行更新,firebase,google-cloud-firestore,google-cloud-functions,Firebase,Google Cloud Firestore,Google Cloud Functions,我正在使用Firebase Cloud函数中的计划任务来查询一个数组,该数组包含许多对象,如果存在匹配条件,则需要更新这些对象。我当前的尝试是使用“array contains”方法获取对象,然后循环它们以找到匹配的条件,然后批量更新项目。这是我的数据结构: 我需要找到一个{ const now=admin.firestore.Timestamp.now(); const liveMeetings=wait admin.firestore().collection('fl_content')。

我正在使用Firebase Cloud函数中的计划任务来查询一个数组,该数组包含许多对象,如果存在匹配条件,则需要更新这些对象。我当前的尝试是使用“array contains”方法获取对象,然后循环它们以找到匹配的条件,然后批量更新项目。这是我的数据结构:

我需要找到一个{ const now=admin.firestore.Timestamp.now(); const liveMeetings=wait admin.firestore().collection('fl_content')。其中('meeting','array contains','liveMeetingDate')。get(); const batch=admin.firestore().batch(); liveMeetings.forEach(文档=>{ 如果(doc.data().liveMeetingDate如本文所述,则以下查询将不起作用:

const liveMeetings = await admin.firestore().collection('fl_content').where('meeting', 'array-contains', 'liveMeetingDate').get();
因为
会议
数组包含一些对象,而不是“简单”或基本数据(例如字符串、数字…)

您可以使用精确的对象查询它,如:

const obj = {active: false, liveMeetingDate: ..., meetingId: ..., ....};
    const liveMeetings = await admin.firestore().collection('fl_content').where('meeting', 'array-contains', 'obj').get();

另一种方法是创建一个新的集合,其中包含类似的文档(相同的文档ID),但具有只包含
liveMeetingDate
属性的
meeting
数组


最后,请注意,由于数组位于映射中,因此需要执行以下操作

await admin.firestore().collection('fl_content').where('liveMeetings.meeting', 'array-contains', ...).get();


(注:我不会将此问题标记为重复问题,因为您在重复问题/答案的评论中明确要求更多帮助)

您想将日期与当前时间进行比较吗?@Ashish是的,我正在将对象中“liveMeetingDate”中的日期与服务器时间戳进行比较。我认为第一个问题是在查询上,因为当我记录任何结果时,它不会消失,不会到达循环。会议是liveMeetings映射的子部分,因此无法查询。@Ashish所以您说的是meetings的数组需要是顶级的,而不是嵌套在对象内部(映射类型)?如果要比较日期,则需要顶级的数组。它在Firebase控制台UI上不起作用。所以我怀疑第三个查询是否返回任何结果
await admin.firestore().collection('fl_content').where('liveMeetings.meeting', 'array-contains', ...).get();