我在Cloud Firestore的单个集合中有1000个文档,是否可以提取随机文档?
举例来说:Students是Firestore中的一个集合,我有1000个学生,我的要求是每次通话随机选择10个学生。
我正在尝试使用Cloud Firestore的Firebase-UI库创建聊天。 这个 github仓库包含我正在使用的相关代码。问题与查询的顺序有关。
看到查询指定为:
Query sChatQuery = sChatCollection.orderBy("timestamp").limit(50);
Run Code Online (Sandbox Code Playgroud)
但是,我以正确的顺序(从旧到新)获得了最旧的50条消息,而不是最新的消息。另一方面,我可以使用以下查询:
Query sChatQuery = sChatCollection.orderBy("timestamp", Query.Direction.DESCENDING).limit(50);
Run Code Online (Sandbox Code Playgroud)
这会检索50条最新消息,但顺序错误(最新消息排在最前面,最旧消息排在最下面)。因此,我不知道该怎么做。
我可以在本地再次反转查询的结果,但是我无法弄清楚该怎么做(我已经走过了FirebaseUI库,但运气不佳)。
编辑
chat对于events集合中的每个事件,我都有其子集合:
events/event_doc/chat/chat_doc
我想得到如下消息:
Message 1
Message 2
Message 3
Message 4
...
Run Code Online (Sandbox Code Playgroud)
使用默认顺序,我会收到如上所示的消息,但是limit说明将快照从1减少到50,并且Message 51(最新的)快照未被检索。
我的Firestore数据库结构:
|
|=>root_collection
|
|=>doc1
|
|=>collection
|
|=>doc2
|
|=>collection
|
|=>doc3
|
|=>collection
Run Code Online (Sandbox Code Playgroud)
现在我想从中获取文件清单root_collection。将有一个包含以下数据的列表{"doc1", "doc2", "doc3"}。我需要它是因为我想制作一个微调器并将这些数据放入微调器中。然后,用户将选择一些文档并下载。
我尝试使用下面的代码:
firestore.collection("root_collection")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
Log.d(TAG,document.getId() + " => " + document.getData());
}
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
Run Code Online (Sandbox Code Playgroud)
但是代码只有在我拥有文档中没有集合的数据结构时才起作用。在其他情况下,中没有任何文档QueryDocumentSnapshot。
谢谢!
由于ORFirestore中没有逻辑运算符,因此我尝试在本地合并2个单独的查询.
现在我想知道如何保持结果的正确顺序.当我独立运行2个查询时,我无法特定地查询结果(至少不是我使用该orderBy方法从Firestore获得结果的顺序).
我的想法是将第二个查询放在onSuccessListener第一个查询中.这是一个表现明智的坏主意吗?
public void loadNotes(View v) {
collectionRef.whereLessThan("priority", 2)
.orderBy("priority")
.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
Note note = documentSnapshot.toObject(Note.class);
//adding the results to a List
}
collectionRef.whereGreaterThan("priority", 2)
.orderBy("priority")
.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
Note note = documentSnapshot.toObject(Note.class);
//adding the results to a List
}
}
});
}
});
}
Run Code Online (Sandbox Code Playgroud) 我正在对一个小应用程序进行一些测试,以了解 firebase-analytics 的工作原理。这是 MainActivity 的代码:
public class MainActivity extends AppCompatActivity {
private FirebaseAnalytics mFirebaseAnalytics;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFirebaseAnalytics = FirebaseAnalytics.getInstance(getApplicationContext());
mFirebaseAnalytics.setAnalyticsCollectionEnabled(true);
mFirebaseAnalytics.setMinimumSessionDuration(10000);
mFirebaseAnalytics.setSessionTimeoutDuration(300);
Bundle bundle = new Bundle();
bundle.putString(FirebaseAnalytics.Param.ITEM_ID,"ID");
bundle.putString(FirebaseAnalytics.Param.ITEM_NAME,"NAME");
bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE,"image");
mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle);
}
Run Code Online (Sandbox Code Playgroud)
要查看我的应用程序是否将数据发送到 Firebase,我尝试使用 DebugView 但它说没有任何设备可用,我还使用了命令
adb shell setprop debug.firebase.analytics.app <package_name>
Run Code Online (Sandbox Code Playgroud)
但什么都没有改变。
如果我使用这 3 个命令
adb shell setprop log.tag.FA VERBOSE
adb shell setprop log.tag.FA-SVC VERBOSE
adb logcat -v time -s FA FA-SVC
Run Code Online (Sandbox Code Playgroud)
我可以看到我的应用程序正在向 firebase 发送一些数据,如图所示
我该怎么做才能启用 DebugView 并实时查看我的应用发送到 Firebase 的内容?
我对使用此代码在集合中搜索文档的效率感到好奇。随着集合中文档数量的增加和数组中项目的数量的增加,这种搜索会变得非常低效吗?是否有更好的方法可以执行此操作,或者可以对数据库进行模式更改以更好地优化此方法?在哪里可以找到Firestore文档的这些功能的时间复杂性?
Query query = db.collection("groups").whereArrayContains("members", userid);
Run Code Online (Sandbox Code Playgroud)
我最初想尝试将组ID存储在该用户下,以便仅抓取该当前用户的组,但是遇到了问题,而且从未找到使用多个ID进行查询来设置FireStoreRecyclerOptions的解决方案。
例:
for(String groupid : list) {
Query query = db.collection("test-groups").document(groupid);
FirestoreRecyclerOptions<GroupResponse> response = new FirestoreRecyclerOptions.Builder<GroupResponse>()
.setQuery(query, GroupResponse.class)
.build();
}
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以向其中添加多个查询FirestoreRecyclerOptions?
我正在尝试提取文档下自动生成的 ID,以便我可以在其他地方使用它。
这是完整的代码:
mStartChatButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final HashMap<String, Object> myChatFields = new HashMap<>();
myChatFields.put("dateJoined", ServerValue.TIMESTAMP );
myChatFields.put("status", "");
myChatFields.put("snoozeUntil", "");
myChatFields.put("myCharacter", "");
myChatFields.put("requestedCustomChatCode", "");
myChatFields.put("groupChatName", "");
myChatFields.put("toInviteMembers", "");
myChatFields.put("lastMessage", "");
myChatFields.put("lastMessageTimeStamp", ServerValue.TIMESTAMP);
mWhammyUsersCollection.document(mCurrentUserId).collection("my-chats")
.document().set(myChatFields)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
String chatId = mWhammyUsersCollection.document(mCurrentUserId)
.collection("my-chats").document().getId();
Log.v("CHATS", chatId);
myChatFields.put("chatCardId", chatId);
Intent goToChatActivity = new Intent(UserProfileActivity.this,
ChatActivity.class);
startActivity(goToChatActivity);
}
});
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我正在使用下面所示的代码生成一个名为“my-chats”的集合,并且 .document() 正在创建自动生成的文档 ID。
mWhammyUsersCollection.document(mCurrentUserId).collection("my-chats")
.document().set(myChatFields)
.addOnSuccessListener(new OnSuccessListener<Void>() {
Run Code Online (Sandbox Code Playgroud)
然后我使用下面显示的代码行尝试从该文档获取 id。
String chatId …Run Code Online (Sandbox Code Playgroud) 至于关于这个主题和类似的问题ChildEventListener,没有相关的答案,所以继承我的.
我有一个本地SQLite数据库,其中包含所有数据,我还有Firebase实时数据库,我正在使用新条目或所有用户的实时更改进行更新.我目前正在使用ChildEventListener如下方法:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getDatabase().getReference();
DatabaseReference childRef = rootRef.child("my_root");
ChildEventListener eventListener = new ChildEventListener()
{
....
};
childRef.addChildEventListener(eventListener);
Run Code Online (Sandbox Code Playgroud)
至于功能,使用此代码,我可以获得有关孩子的实时更改,获取新条目,删除子项以及我需要的所有内容但有一个问题.当监听器的这个特定活动加载时,onChildAdded监听器会在该根上为每个孩子调用大量的时间,如文档中所述:
child_added为每个现有子项触发一次,然后每次将新子项添加到指定路径时再次触发
所以我虽然专注于我真正需要的项目,但我已经完成了:
rootRef.orderByKey().startAt("-WhatTF123456789")...
Run Code Online (Sandbox Code Playgroud)
但后来我丢失了我的CRUD功能,因为它正在收听新条目,而不是所有条目.
所以我想出了一个解决方案.保留节点,其中包含对FireBase数据库所做的所有更改以及一个节点,其中所有用户已阅读并对本地数据库进行了更改以了解谁需要更新,然后使用addChildEventListener此特定节点.但这似乎是多余的.
我有什么选择来处理这种情况?
我有一个名为 Firestore 的集合users,用于存储我的所有用户信息。注册新用户时,我首先使用 Firebase Auth 注册他们,然后在集合中创建记录users。现在我将其存储UID为字段,这意味着当我想查询用户的信息时,我需要使用子句进行查询WHERE。然而,更快查询的一种替代方法是将 存储UID为集合的文档 ID。这样我就可以使用特定 ID 查询集合,直观上看起来更快。
使用UID作为文档 ID 让我担心一些事情:
UIDFirebase Auth 中的唯一性意味着将其用作 Firestore 集合中的文档 ID 时的唯一性。假设您仅基于 进行查询,那么使查询尽可能高效的更好方法是什么UID?或者差异如此微不足道以至于这是一个有争议的问题?
android firebase google-cloud-platform flutter google-cloud-firestore