Вы правы в определенном утверждении документа BSON, это не XML-документ. Поскольку XML загружается в древовидную структуру, состоящую из «узлов», поиск на арбитальном ключе довольно прост.
Документ MonoDB не так прост в обработке, и это «база данных» во многих так что обычно ожидается, что он будет иметь определенную «однородность» местоположений данных, чтобы упростить «индексирование» и поиск.
Тем не менее это можно сделать. Но, конечно, это означает, что на сервере выполняется рекурсивный процесс, и это означает, что обработка JavaScript с помощью $where
.
В качестве примера базовой оболочки, но общий function
просто строковый аргумент для оператора $where
всюду:
db.collection.find(
function () {
var findKey = "find-this",
findVal = "please find me";
function inspectObj(doc) {
return Object.keys(doc).some(function(key) {
if ( typeof(doc[key]) == "object" ) {
return inspectObj(doc[key]);
} else {
return ( key == findKey && doc[key] == findVal );
}
});
}
return inspectObj(this);
}
)
Итак, в основном, проверьте ключи, присутствующие в объекте, чтобы увидеть, соответствуют ли они желаемому «имени поля» и содержимому. Если какой-либо из этих ключей является «объектом», то запишите его в функцию и проверьте снова.
JavaScript .some()
гарантирует, что найденное совпадение будет найдено из функции поиска, дающей результат true
и возвращающий объект, где этот «ключ / значение» присутствовал на некоторой глубине.
Обратите внимание, что $where
по существу означает перемещение всей вашей коллекции, если только не существует какой-либо другой действительный фильтр запросов, который может быть применен к «индексу» в коллекции.
Так что используйте с осторожностью или вообще не работайте и просто работайте с реструктуризацией данных в более работоспособную форму.
Но это даст вам ваш матч.
Используйте следующий код:
private String country_id = "", city_id = "";
private ArrayList<String> country_array;
и заполните свой массив данными:
for (int i = 0; i < items.getResponse().size(); i++) {
String get_country_name = items.getResponse().get(i).getCode();
country_array.add(get_country_name);
}
Теперь для вашего первого адаптера счетчика:
ArrayAdapter<String> country_spinnerArrayAdapter = new adapter_spinner(getActivity(), R.layout.spinner_header, country_array);
country_spinnerArrayAdapter.setDropDownViewResource(R.layout.spinner_item);
binding.etCountry.setAdapter(country_spinnerArrayAdapter);
binding.etCountry.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String selectedItemText = parent.getSelectedItem().toString();
if (position > 0) {
country_id = selectedItemText;
city_id = "";
Load_City(position - 1); // -1 to remove postion of the static country text
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
[117 ] Теперь ваш метод City (2nd spinner):
private void Load_City(int postion) {
ArrayList<String> city_array = new ArrayList<String>();
city_array.add(getString(R.string.city));
for (int i = 0; i < items.getResponse().get(postion).getCities().size(); i++) {
String get_city_name = items.getResponse().get(postion).getCities().get(i).getName();
city_array.add(get_city_name);
}
ArrayAdapter<String> country_spinnerArrayAdapter = new adapter_spinner(getActivity(), R.layout.spinner_header, city_array);
country_spinnerArrayAdapter.setDropDownViewResource(R.layout.spinner_item);
binding.etCity.setAdapter(country_spinnerArrayAdapter);
binding.etCity.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String selectedItemText = parent.getSelectedItem().toString();
if (position > 0) {
city_id = selectedItemText;
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
Я надеюсь, что это помогло
Вы ошиблись ссылкой на первый счетчик.
в строке ниже
int countrySpinnerPosition = spinnerCountry.getSelectedItemPosition();
вы выбрали spinnerCountry вместо spinnerFirst. И вы изначально установили spinnerFirst на первое положение, которое составляет A , и когда вы измените его, чтобы выбрать B его значение, не принятое в методе onItemSelected
, намерение принимает выбранную страну, вероятно, в положении first (0) счетчика, так что для второго счетчика всегда установлено значение «Три» вместо «Четыре».