Flutter - 如何向 firebase 集合中的所有文档添加字段

问题描述 投票:0回答:3

我正在使用 flutter firebase。我想要一个查询来向 firebase 集合中的所有文档添加键和值。

我尝试使用批量写入,但它添加了一个具有字段的新文档。但不合并到现有文档。

var db= Firestore.instance();
var batch = db.batch();
batch.setData(
db.collection("users").document(),
{"status": "Approved"}
);

当我尝试提供类似

document('id')
的文档 ID 时,它仅添加到该文档中。

我尝试了很多并观看了 YouTube 视频,但现在仍然找不到。请帮助我!

firebase flutter firebase-realtime-database google-cloud-firestore
3个回答
3
投票

在应用程序的其中一个页面上创建一个虚拟按钮。按下按钮应在特定集合的所有文档中添加该字段。

在这里,我使用 IconButton 在“users”集合中添加一个名为“bio”的空字段。

您可以在文档中添加该字段后删除该按钮,因为这是您(开发人员)的问题,并且您的应用程序用户不需要该按钮。

IconButton(
                      onPressed: () {
                        FirebaseFirestore.instance
                            .collection('users')
                            .get()
                            .then(
                              (value) => value.docs.forEach(
                                (element) {
                                  var docRef = FirebaseFirestore.instance
                                      .collection('users')
                                      .doc(element.id);

                                  docRef.update({'bio': ''});
                                },
                              ),
                            );
                      },
                      icon: Icon(Icons.done),
                    ),

0
投票

这是因为您使用的是 setData() 方法,而应该使用 updateData() 来更新:

var db= Firestore.instance();
var batch = db.batch();
batch.updateData(
db.collection("users").document(),
{"status": "Approved"}
);

0
投票

让我解释一下我提出的解决方案。让您要添加的键为 x,您要添加的值为 3。将其手动添加到您的第一个文档中,然后使用此查询创建一个按钮并添加 500 件中的 500 件。

_addFieldAllCollection() {
    WriteBatch batch = _fireStore.batch();
    return _fireStore.collection('user').where('x', isEqualTo: 3)
        .orderBy(FieldPath.documentId, descending: true).limit(1).get()
        .then((onValue) {
      print(onValue.docs.first.id);
      _fireStore.collection('users').orderBy(FieldPath.documentId, descending: false).startAfterDocument(onValue.docs.first)
          .limit(500).get()
          .then((onValue2) {
        print(onValue2.size);
        for (var action in onValue2.docs) {
          batch.update(action.reference, {
            'x': 3,
          });
        }
        return batch.commit().then((onValue) {
          print('finish');
        });
      });
    });
  }
© www.soinside.com 2019 - 2024. All rights reserved.