【问题标题】:How do I write a multikey query in MongoDb and C#?如何在 MongoDb 和 C# 中编写多键查询?
【发布时间】:2012-03-14 15:03:00
【问题描述】:

在我们的 Mongo 数据库中,我们有一个由“StoreId”和“ItemId”索引的集合。以下查询带回“In”列表中包含的所有产品商店组合(共 9 个文档)。

var productQuery = Query.In("ItemId", new BsonArray(new List<int> {1, 2, 3}));
var storeQuery = Query.In("StoreId", new BsonArray(new List<int> {1, 2, 3}));
var queryToBringNineDocuments = Query.And(productQuery, storeQuery);

我如何编写一个查询,让我返回带有以下项目存储元组列表中的键的文档?

var neededProductStores = new List<Tuple<int, int>>
{
    new Tuple<int, int>(1, 2),
    new Tuple<int, int>(1, 3),
    new Tuple<int, int>(2, 1),
    new Tuple<int, int>(3, 2)
};

var queryToBringFourDocuments = ?;

【问题讨论】:

  • 您能在这里澄清一下,是 4 个文档还是一个包含 4 个项目数组的文档? MongoDB 只能返回文档,不能返回“子文档”。
  • 我有 9 个单独的文档,用于 item-store 的每个组合。我需要获取这些文件的一个子集。我可以在多个查询中执行此操作,但想知道是否有一种方法可以使用单个查询。

标签: c# mongodb mongodb-.net-driver


【解决方案1】:

在我看来,目前只有一种方法——创建一个包含 id 和查询的额外字段

因此,在您存储到数据库的 c# 类中,您可以拥有:

public string ProductStoreId 
{
  get 
  {
     return string.Format("{0}_{1}",ItemId, StoreId);
  }
  set { } //empty set means that it will be stored to database
}

那么您的查询将是:

var query = Query.In("ProductStoreId", new BsonArray(new List<string> {"1_2", "1_3",.. }));

【讨论】:

    【解决方案2】:

    这也可以通过累积 AND 查询的 OR 查询来完成。但是,如果你有很多组合,它可能会变得很丑。

    var neededProductStores = new List<Tuple<int, int>>
                                    {
                                        new Tuple<int, int>(1, 2),
                                        new Tuple<int, int>(1, 3),
                                        new Tuple<int, int>(2, 1),
                                        new Tuple<int, int>(3, 2)
                                    };
    
      IMongoQuery[] queries =(from t in neededProductStores
           select Query.And(Query.EQ("ItemId", t.Item1), Query.EQ("StoreId", t.Item2))).ToArray<IMongoQuery>();
      var queryToBringFourDocuments = Query.Or(queries);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      • 2016-05-09
      相关资源
      最近更新 更多