Firebase-запрос на основе атрибута существуют (ключ) - PullRequest
0 голосов
/ 28 ноября 2018

Когда я пытаюсь сократить свои данные. Поэтому я решил сохранить userLikeCollection как

questionID = true/false -> где true means like and false means dislike.И если этот документ не существует, это означает, что это neither like nor disliked ...

, и там идентификатор состоит из ( userID + questionID )

Теперь я хочу спросить,этот вопрос нравится пользователю.Есть ли способ добиться этого.

db.collection("userLikeCollection").where(questionID ).exist() 

или прочитайте этот документ с именем строки свойства questionID

db.collection("userLikeCollection").whereStringProperty(questionID).exist()

, где userLikeDocument , как показано ниже

( userID + questionID ) -> Уникальный идентификатор документа - questionID = true / false // где questionID = любой уникальный идентификатор для каждого документа.

Редактировать вопрос

UserLikeDocument - 1

  • blahblahQuestionIdOne = true;

UserLikeDocument - 2

  • blahblahQuestionIdTwo = true;

UserLikeDocument - 3

  • blahblahQuestionIdThree = true;

UserLikeDocument - 4

  • blahblahQuestionIdFour = true;

1 Ответ

0 голосов
/ 28 ноября 2018

Теперь я хочу спросить, нравится ли этот вопрос пользователю.Есть ли способ добиться этого.db.collection ("userLikeCollection"). где (questionID) .exist ()

Да, есть.Чтобы решить эту проблему, вы должны использовать запрос и get() вызов.В коде это выглядит так:

Query query = db.collection("userLikeCollection").whereEqualTo("questionID", true);
query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (QueryDocumentSnapshot document : task.getResult()) {
                if (document.exists()) {
                    Boolean questionID = document.getBoolean("questionID");
                }
            }
        }
    }
});

В этом коде запрос поможет вам найти все документы, в которых свойство questionID будет содержать значение true и использование document.exists()поможет найти, существует ли этот документ на самом деле.

или прочитать тот документ, который имеет имя свойства строки questionID db.collection ("userLikeCollection"). whereStringProperty (questionID) .exist ()

В этом случае вам также следует использовать запрос, но вместо передачи логического значения методу whereEqualTo() вы должны передать строковую строку:

Query query = db.collection("userLikeCollection").whereEqualTo("questionID", id);

, в которой содержится idзначение типа String, которое является фактическим идентификатором вопроса, который вы ищете.

(userID + questionID) -> Уникальный идентификатор документа - questionID = true / false // где questionID = anyуникальный идентификатор для каждого документа.

Это на самом деле возможно в Firestore, но только если имена свойств различаются, скажем, questionID, который содержит логическое значение и и id proPerty, который содержит строковое значение.Это можно сделать, связав два whereEqualTo() звонка так:

Query query = db.collection("userLikeCollection")
    .whereEqualTo("questionID", true)
    .whereEqualTo("id", id);

Редактировать:

Согласно вашему комментарию:

whereEqualTo («questionID», true) появляется только в том случае, если ему нравится, но когда он не нравится. Он не будет извлечен

Это правильно.Чтобы решить вашу проблему, в соответствии с официальной документацией относительно ограничения запросов :

Cloud Firestore не поддерживает следующие типы запросов:

  • Запросы с предложением ! = .В этом случае вы должны разделить запрос на запрос больше, чем запрос и меньше.Например, хотя условие запроса where ("age", "! =", "30") не поддерживается, вы можете получить один и тот же набор результатов, комбинируя два запроса, один с предложением где ("age", "<"," 30 ") и один с предложением где (" age ","> ", 30).

То есть, другими словами, нет !=(не равно) оператор в Firestore.Как говорится, у вас есть возможность разделить ваш запрос на greater-than и less-than запрос, и тогда он будет отлично работать.

Вы также можете создать еще один запрос, который выглядит следующим образом:

Query query = db.collection("userLikeCollection").whereEqualTo("questionID", false);

В этом случае вы получите вопрос со свойством questionID false.

Edit2:

В соответствии с вашим отредактированнымвопрос, в Firestore нет способа фильтровать документы по динамическому идентификатору.Также нет возможности использовать wildcars.Свойства должны иметь одинаковые имена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...