Mongodb находит все словари в списке, который содержит конкретное имя_дисциплины и извлекает отдельные данные этого словаря. - PullRequest
0 голосов
/ 13 сентября 2018

Это мой набор данных. Я потратил много времени на это, но не могу получить желаемый результат. Пожалуйста, помогите мне в поиске моих данных Вы можете увидеть JSON ниже. Я хочу извлечь все дисциплины, которые содержат определенные дисциплины_Имя, например: дисциплина_Имя: "Компьютерные науки"
тогда я хочу извлечь только те словари, которые содержат (дисциплина_Имя: "Компьютерные науки") Кроме того, скажите мне, как получить отдельные данные этого конкретного словаря Я делаю это в питоне Я пробовал следующий код, но получаю фактический вывод

import requests
import re
import json
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["FYP_DataBase"]
mycol = mydb["balochistan_uni"]
data = mydb.balochistan_uni.find({"disciplines.discipline_name":"Computer Science","disciplines.degree_Name":"BE"},{ '_id':0 ,"disciplines":1,"discipline.discipline_Name" :1, })
for d in data:
    print(d)

............................................... ..........

{
    "_id" : ObjectId("5b98e604c0c4d54a5016e646"),
    "uni_name" : "Balochistan University Of Engineering & Technology BUET, Khuzdar",
    "location" : "KHUZDAR P.O Box No. 89100 [BALOCHISTAN] ",
    "web_link" : "http://www.buetk.edu.pk ",
    "province" : "Balochistan",
    "category" : "Public",
    "disciplines" : [ 
        {
            "discipline_name" : "Civil",
            "degree_Name" : "BE",
            "duration" : "4 Years",
            "Fee_per_Year" : "NA",
            "admission_date" : "15-09-2018",
            "Last_Merit" : "50"
        }, 
        {
            "discipline_name" : "Computer Science",
            "degree_Name" : "BS",
            "duration" : "4 Years",
            "Fee_per_Year" : "NA",
            "admission_date" : "31-01-2018",
            "Last_Merit" : "NA"
        }, 
        {
            "discipline_name" : "Computer System",
            "degree_Name" : "BE",
            "duration" : "4 Years",
            "Fee_per_Year" : "NA",
            "admission_date" : "15-09-2018",
            "Last_Merit" : "NA"
        }
    ]
}
{
    "_id" : ObjectId("5b98e60dc0c4d54a5016e648"),
    "uni_name" : "Lasbela University Of Agriculture, Water And Marine Sciences, Uthal LUAWMS, Lasbela",
    "location" : "Lasbela ",
    "web_link" : "http://www.luawms.edu.pk ",
    "province" : "Balochistan",
    "category" : "Public",
    "disciplines" : [ 
        {
            "discipline_name" : "Agriculture",
            "degree_Name" : "BS",
            "duration" : "4 Years",
            "Fee_per_Year" : "15000",
            "admission_date" : "14-09-2018",
            "Last_Merit" : "NA"
        }, 
        {
            "discipline_name" : "Business Administration",
            "degree_Name" : "BBA",
            "duration" : "4 Years",
            "Fee_per_Year" : "15000",
            "admission_date" : "14-09-2018",
            "Last_Merit" : "NA"
        }, 
        {
            "discipline_name" : "Computer Science",
            "degree_Name" : "BS",
            "duration" : "4 Years",
            "Fee_per_Year" : "15000",
            "admission_date" : "14-09-2018",
            "Last_Merit" : "NA"
        }
    ]
}

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Чтобы отфильтровать только те дисциплины, которые соответствуют вашим критериям, вы должны использовать структуру агрегирования.Один из способов сделать это:

 mydb.balochistan_uni.aggregate(
    [

        {
            $redact: {
                            $cond: {
                                  if: { $or:[
                                    {$eq: [ "$discipline_name", "Computer Science" ] },
                                    { "$ifNull": [ "$disciplines",  false] }
                                    ]},
                                  then: "$$DESCEND",
                                  else: "$$PRUNE"
                                }
            }
        },
        {
            $unwind: {
                path : "$disciplines",

            }
        },
        {
            $replaceRoot: {
                newRoot: "$disciplines"
            }
        },
    ]
);

вернет:

{ 
    "discipline_name" : "Computer Science", 
    "degree_Name" : "BS", 
    "duration" : "4 Years", 
    "Fee_per_Year" : "NA", 
    "admission_date" : "31-01-2018", 
    "Last_Merit" : "NA"
}
{ 
    "discipline_name" : "Computer Science", 
    "degree_Name" : "BS", 
    "duration" : "4 Years", 
    "Fee_per_Year" : "15000", 
    "admission_date" : "14-09-2018", 
    "Last_Merit" : "NA"
}
0 голосов
/ 13 сентября 2018

Ваш запрос:

mydb.balochistan_uni.find({
    "disciplines.discipline_name": "Computer Science",
    "disciplines.degree_Name": "BE"
})

возвращает все университеты с дисциплиной «Информатика» и степенью «BE».В вашем запросе не указано, что это должна быть дисциплина «Компьютерные науки» со степенью «BE».

Если вы хотите это сделать, вам нужно сопоставить элемент в массиве disciplines.Запрос должен выглядеть следующим образом:

mydb.balochistan_uni.find({
    "disciplines": {
        "$elemMatch": {
            "discipline_name": "Computer Science",
            "degree_Name": "BE"
        }
    }    
},
{
    "_id": 0, "disciplines": 1
})

Теперь этот запрос будет извлекать только университеты, в которых название дисциплины - «Компьютерные науки», а название степени «Компьютерные науки» - «BE».

Пожалуйста, ознакомьтесь с официальной документацией MongoDB для операторов запросов к массиву.
Если поле в MongoDB содержит массив, вы должны применить эти операторы.

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