【问题标题】:MongoDB and NoRM - Querying collection against a list of parametersMongoDB 和 NoRM - 根据参数列表查询集合
【发布时间】:2011-11-15 15:00:27
【问题描述】:

我需要根据参数列表查询一个集合。 例如我的模型是:

public class Product
{
    string id{get;set;}
    string title{get;set;}
    List<string> tags{get;set;}
    DateTime createDate{get;set;}
    DbReference<User> owner{get;set;}
}

public class User
{
    string id{get;set;}
    ...other properties...
}

我需要查询指定用户拥有并按creationDate排序的所有产品。

例如:

GetProducts(List<string> ownerIDs)
{
    //query
}

如果可能,我需要在一个查询中完成,而不是在 foreach 中。如果需要,我可以更改我的模型

【问题讨论】:

    标签: mongodb mongodb-.net-driver norm


    【解决方案1】:

    听起来您正在寻找 $in 标识符。您可以像这样查询产品:

    db.product.find({owner.$id: {$in: [ownerId1, ownerId2, ownerId3] }}).sort({createDate:1});
    

    只需将 javascript 数组 [ownerId1, ...] 替换为您自己的所有者数组即可。

    请注意:我猜这个查询效率不高。我对 MongoDB 中的 DBRefs 不太满意,它本质上是向非关系数据库添加关系。我建议直接将 ownerID 直接存储在产品对象中并基于此进行查询。

    【讨论】:

    • 关于 DbRef 这不是必须的,我实际上同时拥有 ref 和 id。但是,您能想出一种方法来执行我使用的 linq 表达式中的建议。我使用 NoRM 作为 C# 驱动程序
    • 对于 Linq...这是个好问题。我的第一印象是使用 Contains() 函数并将其传递给一个数组,但我不确定它只需要一个字符串。我会调查的。
    • 这里没有 linq 示例,但有一个标准示例可以帮助您入门:codefather.pl/post/1369797147/… 向下滚动到 $in 部分。
    • 谢谢克林特,我会检查这个
    【解决方案2】:

    使用 LINQ 的解决方案是创建一个用户 ID 数组,然后像这样对它们执行 .Contains:

    List<string> users = new List<string>();
    foreach (User item in ProductUsers)
        users .Add(item.id);
    
    return MongoSession.Select<Product>(p => users .Contains(p.owner.id))
                        .OrderByDescending(p => p.createDate)
                        .ToList();
    

    【讨论】:

      猜你喜欢
      • 2011-06-30
      • 2016-07-21
      • 2015-07-20
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多