2013-03-13 3 views
1

У меня есть документы в моей коллекции «события», которые построены подобным образом:Поиск через документ внутри плохой практики документа?

{ 
    eventname: "blah", 
    invitees: [ 
    { 
     inviteid: 1, 
     userid: 34234 
    }, 
    { 
     inviteid: 2, 
     userid: 5232 
    }] 
} 

Если бы я хотел, чтобы все события, которые пользователь: «34234» был приглашен, было бы в эффективный поиск по каждому invitees массив в каждом документе события? похоже, больше убивает. Я понимаю, что это было бы здорово для реляционных баз данных, но можно ли это сделать хорошо в mongodb?

UPDATE:

Я закончил с использованием этого, и она работала, но до сих пор не знаю, если это отличный способ сделать это: _Events.Collection.FindAll().Where(x => x.Invitees.Any(y => y.UserId == userId)).ToList();

ответ

0

Я не уверен, MongoDB, но вы можете легко выполнить поиск с помощью Linq:

var results = 
    from evt in events 
    where evt.invitees.Any(x => x.userid == 34234) 
    select evt; 

Если число событий относительно невелико, это было бы довольно быстро.

0

Я не думаю, что с ним что-то не так, это одно из преимуществ базы данных документов. Во всяком случае, на нем должен быть указатель. См. mongodb documentation on indexes.

1

Напротив, такие запросы будут хорошо вписываться в MongoDB. Он позволяет применять индекс MultiKey: индекс для поля, у которого тип данных - массив.

db.events.ensureIndex({ "invitees.userid" : 1 }) 

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

+0

Спасибо за ответ, мне было интересно, как я бы тогда вернуться мои результаты в этом случае? 'makeIndex' - это метод void, и я не совсем понимаю, как это применимо в моей ситуации, чтобы возвращать список событий. – anthonypliu

+0

« makeIndex() »создает только индекс, чтобы перечислить документ, используйте:« db.events ». find ({"invitees.userid": 34234}) ', чтобы извлечь только приглашение:' db.events.find ({"invitees.userid": 34234}, {"invitees.inviteid": 1}) ' –

+0

ok поэтому после создания индекса, как вы запрашиваете его? – anthonypliu

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