MongoDB find () с конкретными условиями - PullRequest
0 голосов
/ 29 ноября 2018

Предположим, у меня есть два человека, оба они выиграли Национальную медаль науки и другие награды.Я хочу выяснить, кто из них выиграл награду Национальной медали науки после 1980 года. Поэтому я попытался

db.scientists.find({$and: [
        {
            "awards.award": "National Medal of Science"
        },
        {
            "awards.year": {$gt: 1980
            }
        }
    ]
});   

и вернуть имя обоих ученых.Я предполагаю, что мой вопрос заключается в том, как применить условие к условию в MongoDB.Извините за мой плохой английский.Спасибо.

"name" : {
    "first" : "John", 
    "last" : "Backus"
}, 

"awards" : [
    {
        "award" : "W.W. McDowell Award", 
        "year" : 1967.0, 
        "by" : "IEEE Computer Society"
    }, 
    {
        "award" : "National Medal of Science", 
        "year" : 1975.0, 
        "by" : "National Science Foundation"
    }, 
    {
        "award" : "Turing Award", 
        "year" : 1977.0, 
        "by" : "ACM"
    }, 
    {
        "award" : "Draper Prize", 
        "year" : 1993.0, 
        "by" : "National Academy of Engineering"
    }
]




"name" : {
    "first" : "John", 
    "last" : "McCarthy"
}, 

"awards" : [
    {
        "award" : "Turing Award", 
        "year" : 1971.0, 
        "by" : "ACM"
    }, 
    {
        "award" : "Kyoto Prize", 
        "year" : 1988.0, 
        "by" : "Inamori Foundation"
    }, 
    {
        "award" : "National Medal of Science", 
        "year" : 1990.0, 
        "by" : "National Science Foundation"
    }
]

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Часто документы JSON вкладываются друг в друга.Это означает, что ключ относится к хешу другого значения ключа.В этом случае MongoDB также предлагает возможность поиска документов по значениям, хранящимся во вложенной структуре JSON:

{ 
  "_id": ObjectId ("568c28fffc4be30d44d039aa"), 
  "firstname": "Max", 
  "lastname": "Mustermann", 
  "email": "m.mustermann@example.com", 
  "password": "d9729feb74992cc3482b350163a1a010, 
  " last_login ":" 2015-01-07 ", 
  " note ":" Always pays in time, very good customer! ", 
  " address ": 
  { 
    " country ":" Germany ", 
    " street ":" Beispielstrasse 64 ", 
    " zip ":" 62717 " 
  } 
}
0 голосов
/ 29 ноября 2018

Вы должны использовать elemMatch ;

db.scientists.find({
    awards: {
        $elemMatch: {
            award: "National Medal of Science",
            year: { $gt: 1980 }
        }
    }
}); 

должны сделать трюк

Объяснение Breif

MongoDB ищет массивы по всему, так чтовыдает результат;

любой массив, который содержит;

  • элемент с «наградой»: «Национальная медаль науки»
  • элемент с «годом»': {$ gt: 1980}

$elemMatch решает эту проблему путем принудительного сопоставления на основе элементов. не такой интуитивно понятный

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...