Мне нужно скрыть все данные, связанные с пользователем, чей флаг isActive установлен в значение false. Существует множество коллекций, в которых я использовал коллекцию пользователей по типу DBRef (около 14 коллекций), и каждая коллекция содержит более 10 миллионов записей.Querying mongodb внутреннее поле dbref
Позвольте мне объяснить это более правильно с помощью примера.
Предположим, у меня есть две коллекции:
- пользователя
- Контакт
коллекция пользователя содержит следующие поля:
- Firstname (String)
- Фамилия (String)
- IsActive (Boolean)
Контактная коллекция содержит следующие поля:
- Contacter (Пользователь) Заявленный в качестве типа DBref.
- Контактное лицо (Пользователь) Объявлено о типе DBRef.
- ContactStatus (String)
Теперь я хочу, чтобы огонь запрос, который закачает все контакты которых ContactStatus = "Confirmed" && Contacter.isActive = true && Contactee.isActive = true
С точки зрения MongoDB, запрос будет что-то вроде этого:
db.Contacts.find({"ContactStatus" : "Confirmed", "Contacter.isActive" : true, "Contactee.isActive" : true});
Но когда я запускаю этот запрос в оболочке mongo, он всегда возвращает нулевую запись.
Итак, вопрос здесь 1) Возможно ли выполнить запрос во внутреннем поле DBRef? 2) Если нет, то как я могу это достичь.
Примечание - На данном этапе я не могу изменить свою модель данных. С помощью запроса «in» я могу достичь этого. Но это, в конечном счете, увеличит поездку туда и обратно туда, где мне нужно скрыть этого пользователя.
В настоящее время я использую MongoDB-2.4.5 и весна-данных MongoDB-1.2.3 банку
Пока мой код, как это -
Criteria criteria = new Criteria();
criteria = criteria.where(Contact.CONTACT_REQUEST_STATUS).is(ContactRequestStatusEnum.ACCEPTED);
criteria = criteria.and(Contact.CONTACTER + "." + User.ACTIVE).is(Boolean.TRUE);
criteria = criteria.and(Contact.CONTACTEE + "." + User.ACTIVE).is(Boolean.TRUE);
Query q = new Query(criteria);
List<Contact> contacts = Contacts.find(q, Contact.class);
Спасибо за переигровки @orid. Да, я использую драйвер spring-data-mongodb, и мой класс модели такой же, как вы показали. Но я не понял вашу эту строку - **, но вы можете использовать isActive на контрте, это не предваряет вас ** Не могли бы вы объяснить это немного больше. – mobizen
извините, опечатка. Должно быть **, но вы не можете ** вместо **, но можете **. Исправлено сообщение –