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