2013-03-13 57 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

謝謝你的迴應中,搜索每個陣列做,我不知道我怎麼會再回到在這種情況下我的結果? 'ensureIndex'是一個無效的方法,我不太明白這將如何適用於我的情況返回事件列表 – anthonypliu 2013-03-13 23:45:21

+0

'ensureIndex()'只創建索引以列出文檔,使用:'db.events。 find({「invitees.userid」:34234})'僅檢索inviteid使用:'db.events.find({「invitees.userid」:34234},{「invitees.inviteid」:1})' – 2013-03-13 23:46:55

+0

ok所以在你創建索引之後,你如何查詢它? – anthonypliu 2013-03-13 23:49:19