我正在尝试使用Java for Android开发创建一个查询,该查询仅选择其引用等于给定引用的文档。它将匹配的文档包含路径“ / users / someUser”的引用。我正在创建引用,如下所示:
DocumentReference ref = mDatabase.document("users/someUser");
我也尝试过:
DocumentReference ref = mDatabase.document("/users/someUser");
然后查询:
Query query = mDatabase.collection("myCollection").whereEqualTo("refField", ref).limit(10);
但是,当我运行查询并在onComplete方法中检查task.isSuccessful()
时,它没有通过,即不起作用,而当我删除.whereEqualTo()
时,它通过了并且任务的结果不为空。如何正确使用.whereEqualTo()
检查包含特定参考的所有文档?
应与我的查询匹配的文档示例为:
/myCollection/GDpojS5koac2C7YlIqxS
,其中包含以下字段:
refField: /users/someUser
(类型引用的值)
与我的查询不匹配的文档示例为:
/myCollection/J5ZcVAMYU1nI5XZmh6Bv
,其中包含以下字段:
refField: /users/wrongUser
(类型引用的值)
答案 0 :(得分:0)
我认为您需要添加get()方法来运行查询并添加onCompletionListener。
类似的事情应该起作用:
mDatabase.collection("myCollection")
.whereEqualTo("refField", ref)
.limit(10)
.get()
.addOnCompleteListener({task ->
if(task.isSuccessful){
val result = task.result
})
上面的示例在kotlin中,但是我想在java中是类似的
答案 1 :(得分:0)
您不必担心文档,如果您基于字段创建查询,则所有文档都将返回到“ QuerySnapshot”对象中, 例如,
CollectionReference collectionReference = db.collection(FIRESTORE_USERS);
DocumentReference documentReference = collectionReference.document(userID);
CollectionReference notificationCollection = documentReference.collection(FIRESTORE_NOTIFICATIONS);
notificationCollection.whereEqualTo(USER_TYPE, userType)
.whereGreaterThanOrEqualTo(SEND_AT, calendar.getTime())
.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot documentSnapshots) {
List<DocumentSnapshot> snapshotsList = documentSnapshots.getDocuments();
ArrayList<NotificationCollections> notificationCollectionsArrayList = new ArrayList<>();
for (DocumentSnapshot snapshot : snapshotsList) {
// each document having that particular field based on query
}
}});
在上面的示例中,我正在获取所有与特定用户ID匹配且时间大于或等于所提供时间的文档(在您的情况下将不使用时间)
我希望这对您有帮助...
快乐编码:)