шаблон mongo для запроса массива документов

Я прочитал руководство по mongo 3.6. В нем есть пример json - The bios ExampleCollection, например:

{
    "_id" : 1,
    "name" : {
        "first" : "John",
        "last" : "Backus"
    },
    "birth" : ISODate("1924-12-03T05:00:00Z"),
    "death" : ISODate("2007-03-17T04:00:00Z"),
    "contribs" : [
        "Fortran",
        "ALGOL",
        "Backus-Naur Form",
        "FP"
    ],
    "awards" : [
        {
            "award" : "W.W. McDowell Award",
            "year" : 1967,
            "by" : "IEEE Computer Society"
        },
        {
            "award" : "National Medal of Science",
            "year" : 1975,
            "by" : "National Science Foundation"
        },
        {
            "award" : "Turing Award",
            "year" : 1977,
            "by" : "ACM"
        },
        {
            "award" : "Draper Prize",
            "year" : 1993,
            "by" : "National Academy of Engineering"
        }
    ]
}

Согласно руководству, чтобы запросить массив документов, QL выглядит следующим образом:

db.bios.find(
   {
      awards: {
                $elemMatch: {
                     award: "Turing Award",
                     year: { $gt: 1980 }
                }
      }
   }
)

Я использую шаблон spring mongo для запроса этого документа, используя приведенный выше экспресс:

Query query = new Query();
query.addCriteria( Criteria.where("awards").elemMatch( 
Criteria.where("award").is("Turing Award").and("year").gt(new Integer(1980))) );
List<TestEntity> list = mongoTemplate.find(query, TestEntity.class, "testentity");
Assert.assertTrue(!list.isEmpty());
//testentity is a collection in my local db to store example json text.

Я не понимаю, почему список результатов пуст. Я отлаживаю последний оператор и смотрю переменную запроса. Это строковый формат:

Query: { "awards" : { "$elemMatch" : { "award" : "Turing Award" , "year" : { "$gt" : 1980}}}}, Fields: null, Sort: null

и копировать

{ "awards" : { "$elemMatch" : { "award" : "Turing Award" , "year" : { "$gt" : 1980}}}}

для запроса клиентского инструмента robo 3T mongo. он запрашивает 3 результата. Как работает код Java?
спасибо.


person zht    schedule 15.05.2018    source источник
comment
у вас нет ни одного элемента, соответствующего запросу.   -  person Gagan Chouhan    schedule 15.05.2018
comment
Было бы полезно, если бы вы действительно показали документ, соответствующий результату. Запрос выглядит хорошо, поэтому я могу только предположить, что ваш код подключается к чему-то другому, чем вы запускаете запрос для тестирования.   -  person Neil Lunn    schedule 15.05.2018
comment
Образец представляет собой фрагмент всего текста BIOS в формате json, показаны только его структуры. см. docs.mongodb.com/manual/reference/bios-example-collection Я хочу знать, почему не работает java-код, но тот же запрос выполняется в клиенте mongo.   -  person zht    schedule 15.05.2018
comment
как говорит @GaganChouhan, теперь все в порядке. Я запрашиваю другую базу данных, настроенную в application.properties. В коллекции БД есть только один документ, и он не соответствует этому запросу. благодарю вас.   -  person zht    schedule 15.05.2018


Ответы (1)


Попробуйте изменить

{
    "award" : "Turing Award",
    "year" : 1977,
    "by" : "ACM"
},

to

 {
    "award" : "Turing Award",
    "year" : 1981,
    "by" : "ACM"
 }
person Gagan Chouhan    schedule 15.05.2018