【问题标题】:Searching through document inside of document bad practice?在文档中搜索文档不好的做法?
【发布时间】:2013-03-13 21:48:19
【问题描述】:

我的“事件”集合中有与此类似的文档:

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

如果我想要 user: "34234" 被邀请参加的所有事件,那么在每个事件文档中搜索每个 invitees 数组是否有效?似乎杀过头了。我知道这对于关系数据库来说会很棒,但是这在 mongodb 中可以做得很好吗?

更新:

我最终使用了它,它确实有效,但仍然不知道这是否是一个很好的方法: _Events.Collection.FindAll().Where(x => x.Invitees.Any(y => y.UserId == userId)).ToList();

【问题讨论】:

    标签: c# mongodb database


    【解决方案1】:

    相反,这样的查询很适合 MongoDB。 它允许您应用 MultiKey 索引:数据类型为数组的字段的索引。

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

    这样,您不必在每个文档中搜索每个数组

    【讨论】:

    • 感谢您的回复,我想知道在这种情况下我将如何返回我的结果? ensureIndex 是一个 void 方法,我不太明白这将如何应用于我的情况以返回事件列表
    • 'ensureIndex()' 仅创建索引以列出文档,使用:'db.events.find({"invitees.userid" : 34234})' 仅检索邀请ID 使用: 'db.events.find({"invitees.userid" : 34234}, {"invitees.inviteid" : 1})'
    • 好的,创建索引后,如何查询?
    • 文档列表使用:db.events.find({"invitees.userid" : 34234})。要仅检索邀请 ID,请使用:db.events.find({"invitees.userid" : 34234}, {"invitees.inviteid" : 1})
    • 我试过了,它不能在 Visual Studio 中编译,我正在使用 10gen c# 驱动程序,我正在尝试将该对象插入到 .find 方法中,它只是说无效的表达式,它只接受一个 MongoQuery 对象
    【解决方案2】:

    我不确定 mongodb,但您可以使用 Linq 轻松执行搜索:

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

    如果事件的数量相对较少,这会很快。

    【讨论】:

      【解决方案3】:

      我不认为这有什么问题,这是文档数据库的好处之一。如果有的话,你应该有一个索引。请参阅mongodb documentation on indexes

      【讨论】:

        猜你喜欢
        • 2017-07-11
        • 1970-01-01
        • 2011-11-04
        • 2017-01-13
        • 2011-06-01
        • 2022-08-12
        • 2021-05-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多