我正在阅读firestore flutter sdk文档。它展示了如何使用可序列化类自动将文档转换为对象,示例如下:
class Movie {
Movie({required this.title, required this.genre});
Movie.fromJson(Map<String, Object?> json)
: this(
title: json['title']! as String,
genre: json['genre']! as String,
);
final String title;
final String genre;
Map<String, Object?> toJson() {
return {
'title': title,
'genre': genre,
};
}
}
然后使用添加功能创建一个新文档:
await moviesRef.add(
Movie(
title: 'Star Wars: A New Hope (Episode IV)',
genre: 'Sci-fi'
),
);
添加新文档后或查询时如何获取documentId?
我以前尝试过实现这样的行为,在Firebase Firestore中,要么调用moviesRef.add()
,然后Firebase将添加一个具有完全自动生成的uid的新文档,要么如果您有一个特定的uid,那么您可以只使用moviesRef.doc(hereTheId).set()
。
然而,moviesRef.add()
返回一个DocumentReference
,您可以从中获得它。例如:
使用then:
collection('students').add(/*...*/)
则((val)=>print(val.documentID)});
使用wait/async:
final newDocument = await moviesRef.add(/*...*/);
print(newDocument.documentID);
您也可以在发送请求之前获得一个完全自动生成的uid,然后像这样调用moviesRef.doc(hereTheId).set()
:
final String id = moviesRef.doc().id;
moviesRef.doc(id).set(/*...*/)`
希望这能有所帮助。
我认为我们还需要操作Ref,以便能够像您上面提到的那样使用add方法,该方法将获得Future<DocumentReference> add(Movie data) Returns a DocumentReference with an auto-generated ID, after populating it with provided data.
如下所示:
final moviesRef = FirebaseFirestore.instance.collection('movies').withConverter<Movie>(
fromFirestore: (snapshot, _) => Movie.fromJson(snapshot.data()!),
toFirestore: (movie, _) => movie.toJson(),
);
在添加它的同时,你需要添加文档id,你可以这样实现:
final moviesRef =
FirebaseFirestore.instance.collection('movies').withConverter<Movie>(
fromFirestore: (snapshot, _) => Movie.fromJson(snapshot.data()!),
toFirestore: (movie, _) => movie.toJson(),
);
// Add a movie
DocumentReference docreference = await moviesRef.add(
Movie(title: 'Star Wars: A New Hope (Episode IV)', genre: 'Sci-fi'),
);
String id = docreference.id;
debugPrint('documentId: $id'); // will give you the added Document documentId.