我想在firestore
其中chatRooms
将是我的集合名称,myUid and opponentsUid
的组合将是我的子集合,其中将放置不同的文档。我的问题是我想检查我的集合是否包含名为myUid_opponentsUid
或opponentsUid_myUid
的子集合,并且我无法搜索最佳查询来执行此操作。
我所知道的是,我们可以获取整个列表,然后检查它是否包含特定的房间,但它是一个漫长的过程,所以我想要更好的方法。
提前致谢。
答案 0 :(得分:1)
您的问题中有一些误解首先要清理:
在Firestore集合中,作为不同的实体并不存在。它是集合中的文档,使其变得可见。
此外,集合只能包含文档,而文档又可以包含集合,但结构必须交替,因此您不能拥有名为chatRooms的集合,其中包含集合myUid_opponentUid。在chatRooms里面必须有一个文件。
因此,如果聊天室包含消息,那么直接执行所需操作的方法是创建表示该chatRoom的文档。然后在其中创建消息的子集合。
如果在创建复合chatRoom密钥之前对UID进行排序,则可以使用单个get()
来测试聊天室是否存在。结构看起来像这样:
chatRooms/(uid-pair)/messages/(message-id)
请注意,您实际上并不需要在chatRoom/(uid-pair)
级别存储任何内容来创建messages
级别的子级:您只需创建新邮件并直接收听。
答案 1 :(得分:0)
尝试阅读孩子总数。希望这件事可以帮助你。如果你想实现你自己的api然后尝试使用Firebase Functions
..我想要添加的最后一件事是,如果你想添加get Count而不读取你必须的孩子的数量在存储数据之前实现一个getChildCount方法,然后用JiGh_31GA20JabpZBfa
,1`这样的键附加它们,只读取密钥然后使用逗号分隔符,你会得到这个父元素是否包含子元素的结果。
DatabaseReference myRef = database.getReference();
//You can use the single or the value.. depending if you want to keep track
String id= UUID.randomUUID().toString();//randomID for task
Object object=new Object ();
public int chidcount(String child){
string childcount="0";
//You can use the single or the value.. depending if you want to keep track
myRef.child(child).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot snap: dataSnapshot.getChildren()) {
childcount=snap.getChildrenCount();
Log.e(snap.getKey(),snap.getChildrenCount() + "");
}
addvalue(childcount);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private addvalue(String childcount){
object=setid(id);
object=setname("name");
getchildCount("object");
mdatabaseRef.child("rating").child(manager.getId()+childcount).child(currentEmployee.getId()).child(id).setValue(rating);}
答案 2 :(得分:0)
我知道我迟到了。 为将来的用户发布。 试试这个:
DocumentReference datab = db.collection("collection_name").document("Doc_name");
datab.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
if(documentSnapshot.contains("field_name"))
{
Toast.makeText(YourActivity.this, "Child exixts.", Toast.LENGTH_SHORT).show();
}
else
Toast.makeText(YourActivity.this, "Doesnt exits.", Toast.LENGTH_SHORT).show();
}
});
答案 3 :(得分:0)
要让Firebase Firestore检查文档是否具有条目(字段),请使用此命令
firebaseFirestore.collection("Users").document(userId)
.addSnapshotListener {
documentSnapshot, _ ->
if (documentSnapshot!!.contains("name")) {
Log.i("Name", "Name exists")
} else {
Log.i("Name", "Name doesn't exists")
}
}