Пожалуйста, позвольте мне заполнить ответ @LukeH с некоторым примером кода, поскольку я его протестировал. Я считаю, что это может быть полезно для некоторых:
public class Order
{
public string OrderId { get; set; }
public DateTime OrderDate { get; set; }
public int Quantity { get; set; }
public int Total { get; set; }
public Order(string orderId, DateTime orderDate, int quantity, int total)
{
OrderId = orderId;
OrderDate = orderDate;
Quantity = quantity;
Total = total;
}
}
public void SampleDataAndTest()
{
List<Order> objListOrder = new List<Order>();
objListOrder.Add(new Order("tu me paulo ", Convert.ToDateTime("01/06/2016"), 1, 44));
objListOrder.Add(new Order("ante laudabas", Convert.ToDateTime("02/05/2016"), 2, 55));
objListOrder.Add(new Order("ad ordinem ", Convert.ToDateTime("03/04/2016"), 5, 66));
objListOrder.Add(new Order("collocationem ", Convert.ToDateTime("04/03/2016"), 9, 77));
objListOrder.Add(new Order("que rerum ac ", Convert.ToDateTime("05/02/2016"), 10, 65));
objListOrder.Add(new Order("locorum ; cuius", Convert.ToDateTime("06/01/2016"), 1, 343));
Console.WriteLine("Sort the list by date ascending:");
objListOrder.Sort((x, y) => x.OrderDate.CompareTo(y.OrderDate));
foreach (Order o in objListOrder)
Console.WriteLine("OrderId = " + o.OrderId + " OrderDate = " + o.OrderDate.ToString() + " Quantity = " + o.Quantity + " Total = " + o.Total);
Console.WriteLine("Sort the list by date descending:");
objListOrder.Sort((x, y) => y.OrderDate.CompareTo(x.OrderDate));
foreach (Order o in objListOrder)
Console.WriteLine("OrderId = " + o.OrderId + " OrderDate = " + o.OrderDate.ToString() + " Quantity = " + o.Quantity + " Total = " + o.Total);
Console.WriteLine("Sort the list by OrderId ascending:");
objListOrder.Sort((x, y) => x.OrderId.CompareTo(y.OrderId));
foreach (Order o in objListOrder)
Console.WriteLine("OrderId = " + o.OrderId + " OrderDate = " + o.OrderDate.ToString() + " Quantity = " + o.Quantity + " Total = " + o.Total);
//etc ...
}
Это действительно запутанная тема. Я работаю в 10gen, и мне пришлось потратить некоторое время, обворачивая вокруг себя;)
Давайте рассмотрим, как обработчик запросов обрабатывает этот запрос.
Вот еще раз:
> db.test.find({ b : { $gt : 4, $lt : 6}});
Когда он попадает в запись, которая кажется, что она не должна совпадать ...
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 4, 6, 8 ] }
совпадение не выполняется против каждого элемента массива, а скорее против массива в целом.
Сравнение выполняется в три этапа:
Шаг 1: Найдите все документы, где b имеет значение больше 4
b: [2,4, 6,8], поскольку 6 & amp; 8 больше 4
Шаг 2: найдите все документы, где b имеет значение менее 6
b: [2,4,6,8], так как 2 & amp; 4 меньше 6
Шаг 3: Найдите набор документов, которые соответствуют на обоих этапах 1 и am; 2.
Документ с b: [2,4,6,8] соответствовал обеим этапам 1 & amp; 2, поэтому возвращается как совпадение. Обратите внимание, что результаты также дедуплицируются на этом этапе, поэтому один и тот же документ не будет возвращен дважды.
Если вы хотите, чтобы ваш запрос применялся к отдельным элементам массива, а не к массиву в целом, вы можете использовать оператор $ elemMatch. Например,
> db.temp.find({b: {$elemMatch: {$gt: 4, $lt: 5}}})
> db.temp.find({b: {$elemMatch: {$gte: 4, $lt: 5}}})
{ "_id" : ObjectId("4d558b6f4f0b1e2141b66660"), "b" : [ 2, 3, 4, 5, 6 ] }
Поскольку вы не проверяли документацию.
См.
http://www.mongodb.org/display/DOCS/Advanced+Queries
и проверьте «диапазоны» на странице.
Правильно ли ваш синтаксис запроса (сравните с примером)
, а также ваш «почему a: 2 "часть вопроса имеет смысл, поскольку« a »не участвует в вашем запросе. Если вы хотите найти a: 1, тогда вы должны включить его в свой запрос.
Имейте в виду, что все предложения запроса объединены по умолчанию, если вы не используете оператор $ или.
$ gt
Syntax: {field: {$gt: value} }
например:
db.inventory.find( { qty: { $gt: 20 } } )
$ lt
Syntax: {field: {$lt: value} }
например:
db.inventory.find( { qty: { $lt: 20 } } )
eg2:
db.inventory.find({ qty : { $gt : 20, $lt : 60}});