Использование $ и оператора в MongoDB Compass [дубликат]

Пожалуйста, позвольте мне заполнить ответ @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 ...
}
21
задан paullb 15 February 2011 в 08:08
поделиться

4 ответа

Это действительно запутанная тема. Я работаю в 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 ] }
57
ответ дан jared 19 August 2018 в 04:35
поделиться
  • 1
    Спасибо, Джаред, за хорошо проясненный ответ. Однако, пытаясь это сделать, похоже, что это не работает. (Я попробовал & quot; db.test.find ({b: {$ elemMatch: {$ gt: 4, $ lt: 6}}}); & quot ;, как вы описали. (См. Отредактированный вопрос для деталей) Можете ли вы пролить любой свет на это? – paullb 15 February 2011 в 08:06
  • 2
    Странный. Меня устраивает. & GT; db.array2.save ({b: [2,3,4,5]}) & gt; db.array2.save ({b: [2,4,6,8]}) & gt; db.array2.find ({b: {$ elemMatch: {$ gt: 4, $ lt: 6}}}) {& quot; _id & quot; : ObjectId ("4d5a9268ec5855af36625ed6"), "b" : [2, 3, 4, 5]} & gt; Какую версию MongoDB вы используете? $ elemMatch был добавлен 1.3.1, поэтому, если вы все еще используете 1.2, это не сработает. – jared 15 February 2011 в 15:50
  • 3
    Здесь не работает. Просто скопированы и вставлены ваши запросы (вставка, а затем запрос). У меня 1.6.5. Похоже, это может быть ошибка: jira.mongodb.org/browse/SERVER-1264 – paullb 16 February 2011 в 03:10
  • 4
    Ах. Да вы правы. Я выполнял тесты в 1.7.5. Когда я работаю в 1.6.5, это не сработает. похоже, что этого не будет. хорошей новостью является то, что 1.8 выходит очень скоро и включит это исправление. – jared 16 February 2011 в 19:20

Поскольку вы не проверяли документацию.

См.

http://www.mongodb.org/display/DOCS/Advanced+Queries

и проверьте «диапазоны» на странице.

Правильно ли ваш синтаксис запроса (сравните с примером)

, а также ваш «почему a: 2 "часть вопроса имеет смысл, поскольку« a »не участвует в вашем запросе. Если вы хотите найти a: 1, тогда вы должны включить его в свой запрос.

Имейте в виду, что все предложения запроса объединены по умолчанию, если вы не используете оператор $ или.

-9
ответ дан Andreas Jung 19 August 2018 в 04:35
поделиться
  • 1
    Кроме того: если вас интересует подмножество полей: mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields – Andreas Jung 11 February 2011 в 07:47
  • 2
    Спасибо, что указали пример диапазона на этой странице. Я видел эту страницу, но пропустил раздел диапазона. Синтаксис, очевидно, правильный, поскольку запрос выполняется, но я просто не пользуюсь коэффициентом дальности. "& Quot; почему a: 2" действительно имеет смысл, поскольку однозначно идентифицирует каждую строку, ее не нужно включать в запрос. Я должен также указать, что если предложение интерпретируется как AND, тогда мой запрос должен по-прежнему корректно принимать диапазон. Так что спасибо за ссылку, но не спасибо за общую грубость. – paullb 11 February 2011 в 07:48
  • 3
    Общая грубость? Пожалуйста, прочитайте учебник. – Andreas Jung 11 February 2011 в 09:05
  • 4
    Да. вы общая хамство. – paullb 11 February 2011 в 09:17
  • 5
    Учебник также не работал: & gt; db.test.find ({b: {$ gt: 4, $ lt: 6}}); {& quot; _id & quot; : ObjectId ("4d54cff54364000000004331"), "a" : 1, "b" : [2, 3, 4, 5]} {"_id" : ObjectId ("4d54d0074364000000004332"), "a" : 2, "b" : [2, 4, 6, 8]} & gt; – paullb 11 February 2011 в 09:18
.find( {$and:[ {b:{$gt:4}}, {b:{$lt:6}} ]} )
0
ответ дан Anon 19 August 2018 в 04:35
поделиться
  • 1
    Нет. Синтаксис, показанный в принятом ответе, является правильным и уже является "и" операция. Это краткий и плохой пример читаемого синтаксиса. – Blakes Seven 29 October 2015 в 05:32

$ 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}});
4
ответ дан Jijo Paulose 19 August 2018 в 04:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: