使用nodejs从firestore文档中删除字段

Posted

技术标签:

【中文标题】使用nodejs从firestore文档中删除字段【英文标题】:Delete fields from a firestore document using nodejs 【发布时间】:2019-11-25 12:16:13 【问题描述】:

我正在尝试从 Firestore 文档中删除字段,但没有成功。

我已经搜索了我收到的错误消息,但我可以找到几页我已经在做的事情的链接。我确信这很简单,但我现在不知所措。

const Firestore = require('@google-cloud/firestore');
const admin = require('firebase-admin');
const FieldValue = admin.firestore.FieldValue;

const firestore = new Firestore(
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
);
const settings = timestampsInSnapshots: true;
firestore.settings(settings);


var updateDoc = firestore.collection('XXXXXXXX').doc('XXXXXXX').update(
    fieldToBeDeleted: FieldValue.delete()
); 

我希望该字段被删除,但我收到以下错误消息:

Error: Update() requires either a single javascript object or an alternating list of field/value pairs that can be followed by an optional precondition. Argument "dataOrField" is not a valid Document. Couldn't serialize object of type "DeleteTransform". Firestore doesn't support JavaScript objects with custom prototypes (i.e. objects that were created via the 'new' operator).
    at WriteBatch.update (XXXXXXXXXX\node_modules\@google-cloud\firestore\build\src\write-batch.js:359:23)
    at DocumentReference.update (XXXXXXXXXX\node_modules\@google-cloud\firestore\build\src\reference.js:387:14)
    at Object.<anonymous> (XXXXXXXXXX)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at startup (bootstrap_node.js:191:16)

【问题讨论】:

您似乎在混合使用 Firebase Admin SDK 和 Cloud SDK。尝试只使用其中一个符号,而不是同时使用两个符号。您使用的是 Cloud SDK 中的 Firestore,但使用的是管理 SDK 中的 FieldValue.delete() 道格做到了。谢谢您的帮助。我从顶部删除了 2 行管理 SDK 内容,并将删除行更改为“fieldToBeDeleted: Firestore.FieldValue.delete()” 【参考方案1】:

显然,您不能在 Cloud SDK 和 Firebase Admin SDK(封装了 Cloud SDK)之间混合使用符号。 Firebase 导出自己的符号,这些符号不能用于直接转到 Cloud SDK 的调用。调用者必须使用其中一种,但不能同时使用两种。

编辑:

这是最终工作的代码,仅使用 Cloud SDK,没有 Firebase Admin SDK。

const Firestore = require('@google-cloud/firestore');

const firestore = new Firestore(
  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
);
const settings = timestampsInSnapshots: true;
firestore.settings(settings);


var updateDoc = firestore.collection('XXXXXXXX').doc('XXXXXXX').update(
    fieldToBeDeleted: Firestore.FieldValue.delete()
); 

【讨论】:

【参考方案2】:

我在 Cloud Functions 中遇到了类似的写入批处理问题。最初,我被允许使用 docRef = admin.firestore().collection('XXXXXXX').doc('XXXXXX') 以及 Cloud SDK 中的 FieldValue.delete()。

直到最近我才开始在我的代码中遇到错误,并且我不知道我的问题是什么(因为我没有更改这部分代码)直到我遇到这个问题和 Doug 的回答.无论如何,我对解决方案的处理方式略有不同(但仍然符合 Doug 的建议),并且只使用了 Admin SDK。

import * as admin from 'firebase-admin';

const firestoreInstance = admin.firestore();
const fieldValue = admin.firestore.FieldValue;
const docRef = firestoreInstance.collection('XXXXXXX').doc('XXXXXXX');
const batch = firestoreInstance.batch();

...

batch.update(docRef,  fieldToBeDeleted: fieldValue.delete() );

return batch.commit();

【讨论】:

【参考方案3】:

我今天遇到了类似的错误,结果是版本不匹配问题。 我的应用程序有一个正在导入 firebase-admin 的库,但它是旧版本的。 FieldValue.delete 是从较新版本导入的,并由导入旧版本 firebase-admin 的代码保存。这就是无法识别该符号的原因。

【讨论】:

以上是关于使用nodejs从firestore文档中删除字段的主要内容,如果未能解决你的问题,请参考以下文章

无法从 Firestore 文档中删除字段 (Flutter)

FieldValue.delete() 不会删除 firestore 文档中的字段键

如何使用颤振删除 Firestore 文档中的字段

Google Firestore 删除多个字段

如何使用 Flutter 在 Firestore 中删除具有特定值的多个文档

更新firestore文档中嵌套对象中的字段?