Как мне написать многопользовательский запрос в MongoDb и C #? - PullRequest
4 голосов
/ 14 марта 2012

В нашей базе данных Mongo есть коллекция, проиндексированная "StoreId" и "ItemId".Следующий запрос возвращает все комбинации магазинов продуктов (всего 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 = ?;

Ответы [ 2 ]

4 голосов
/ 14 марта 2012

Мне кажется, что в настоящее время есть только один способ - создать дополнительное поле, которое будет содержать и идентификаторы, и запрос к нему

Итак, в вашем классе 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",.. }));
1 голос
/ 15 марта 2012

Это также можно сделать с помощью запроса ИЛИ, который накапливает запросы И. Хотя, если у вас много комбинаций, это может быть довольно уродливо.

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);
...