2013-07-31 2 views
0

Мне нужно скрыть все данные, связанные с пользователем, чей флаг isActive установлен в значение false. Существует множество коллекций, в которых я использовал коллекцию пользователей по типу DBRef (около 14 коллекций), и каждая коллекция содержит более 10 миллионов записей.Querying mongodb внутреннее поле dbref

Позвольте мне объяснить это более правильно с помощью примера.

Предположим, у меня есть две коллекции:

  1. пользователя
  2. Контакт

коллекция пользователя содержит следующие поля:

  1. Firstname (String)
  2. Фамилия (String)
  3. IsActive (Boolean)

Контактная коллекция содержит следующие поля:

  1. Contacter (Пользователь) Заявленный в качестве типа DBref.
  2. Контактное лицо (Пользователь) Объявлено о типе DBRef.
  3. 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); 

ответ

2

Да, вы можете запросить по поля DbRef, но не так, как вы это делаете.

DbRef является небольшой суб-документы, которые содержат два поля:

$ref -The ссылка сбора

$id - значение _id документа в этой коллекции ссылочного

(на самом деле существует третье поле $db, если ссылка относится к другому db)

Таким образом, используя оболочку, вы можете запросить только contcont. $ id (который возвращает идентификатор объекта в коллекции пользователей) или $ ref, но вы не можете запрашивать что-то вроде contract.isActive, поскольку это поле пользователя, а не Ref, и оболочка не извлекает пользователя.

Если вы используете драйвер Java, как Contacter и контактеров представлены как com.mongodb.DBRef, который имеет метод выборки(), чтобы получить DBObject (пользователь)

При использовании пружинно-данных-MongoDB, вы можете захотеть иметь класса, такие как:

class Contact { 

@DBRef 
User contacter; 

@DBRef 
User contactee; 

String contactStatus; 

} 

будут загружены оба объекта пользователя для вас

+0

Спасибо за переигровки @orid. Да, я использую драйвер spring-data-mongodb, и мой класс модели такой же, как вы показали. Но я не понял вашу эту строку - **, но вы можете использовать isActive на контрте, это не предваряет вас ** Не могли бы вы объяснить это немного больше. – mobizen

+0

извините, опечатка. Должно быть **, но вы не можете ** вместо **, но можете **. Исправлено сообщение –

Смежные вопросы