nvbach91 / 4IZ268-2019-2020-ZS

A repository for laboratories of subject 4IZ268, Fall Semester 2019/2020.
MIT License
0 stars 6 forks source link

restdb.io - přidání záznamů do subkolekce #81

Open hejj06 opened 4 years ago

hejj06 commented 4 years ago

Dobrý den,

chtěl bych se zeptat, jak mohu přidávat nové "podobjekty" do již existujících záznamů. Návody na restdb jsem samozřejmě již zkoušel, ale nic z variant mi nefungovalo...

Jako nejrozumnější varianta se mi zdála být tato pro metodu POST: "https://.restdb.io/rest//ID/", nicméně i v popisu je napsáno, že to slouží pro vytvoření child dokumentu v sub kolekci, jenomže já mám data uložená (viz příklad níže) jako "select one department" nebo "select many task" -> tedy "child list of task/department" nepoužívám. Když jsou ale data uložená takto, tak nelze přistoupit z odkazu na tu poslední subkolekci (".../").

Zde přikládám strukturu mých dat pro ukázku:

{ "_id": "5e1e3fb991eb7c5a0002c673", "firstname": "Jakub", "surname": "Hejda", "salary": 99000, "department": [ { "_id": "5deb846191eb7c5a00006933", "description": "They are responsible for all hardware device", "name": "IT", "_created": "2019-12-07T10:52:17.538Z", "_changed": "2019-12-07T10:53:14.270Z" } ], "task": [ { "_id": "5defdd1691eb7c5a0000b8c8", "description": "Check servers", "relevancy": "low", "done": false, "code": "A102", "_created": "2019-12-10T17:59:50.393Z", "_changed": "2019-12-10T17:59:50.393Z" } ] }

Chtěl bych se tedy zeptat, jestli nevíte, kde dělám chybu, případně jestli se k tomu nemá přistupovat spíš nějak přes metody PUT (a např $push), což jsem se také pokoušel, ale data se stejně nepovedlo uložit. Zkrátka která varianta by tedy měla být správná?

Jinak jako odezvu to vždy dává 400 (Bad Request).

Předem mockrát děkuji.

nvbach91 commented 4 years ago

A tahle ukazka ma byt to, co chcete? Nebo to, co zatim mate?

hejj06 commented 4 years ago

Toto mám a chtěl bych na základě dat získaných z inputů (kde získávám code, description, relevancy a done) tato data přidat do databáze.

Pochopil jsem ze struktury tabulek na restdb.io, že bude potřeba úkol přidat nejprve do tabulky tasks (to se mi podařilo) a následně tento úkol přes automaticky vytvořené "_id" přidělit zaměstnanci. Tudíž bych například k tomuto zaměstnanci chtěl přidat další task.

nvbach91 commented 4 years ago

Pro pridavani objektu do pole v dokumentu se pouziva oparator $push, ten ho prida na konec seznamu.

Pro mazani z tehoz pole je operator $pull, pricemz specifikujete identifikator objektu, ktery se ma smazat

https://restdb.io/docs/data-manipulation-with-rest#theXXpushXoperator

nvbach91 commented 4 years ago

HTTP metoda je v obou pripadech PUT (menime obsah existujiciho dokumentu v kolekci)

hejj06 commented 4 years ago

Já si původně myslel, že to bude tahle varianta, ale nějak mi nefungovala, tak jsem začal hledat jiná řešení.

Mohl bych se tedy zeptat přímo na téhle části kódu, jestli nedělám chybu např v JSON zápisu, protože zde žádnou chybu já nevidím... (tu POST metodu měním na PUT až níže v tom ajaxu, stejně jako data a url)

var post = { async: true, crossDomain: true, url: "https://mycompanydb-704c.restdb.io/rest/employee", method: "POST", headers: { "content-type": "application/json", "x-apikey": "5deb8ea54658275ac9dc240a", "cache-control": "no-cache" }, "processData": false, "data": "data" };

var jsondata = { "$push": { "task": [{ "_id": response._id, "code": inputCode, "description": inputDescription, "relevancy": inputRelevancy, "done": inputDone }] } };

                $.ajax(post,
                    post.method = "PUT",
                    post.data = JSON.stringify(jsondata),
                    post.url = `https://mycompanydb-704c.restdb.io/rest/employee/${element._id}`)
                    .done(function (response) {
                        console.log(response);
                    });

Předem moc děkuji.

nvbach91 commented 4 years ago

Jako první věc máte chybu v syntaxi, jak volat ajax request na restdb, podívejte se zde. https://github.com/nvbach91/4IZ268-2019-2020-ZS/issues/74

Druhá věc je logika. Vy potřebujete vědět, že 1) posíláte PUT request 2) na určitý dokument identifikovaný nějakým ID ve vaši kolekci (z těchto informací sestavíte cílový URL) 3) s požadavkem na mutaci tohoto dokumentu (což je operace $push s záznamem, který chcete přidat do pole tohoto dokumentu)

Tohle přesně odpovídá těm 3 řádkům v dokumentaci. image

hejj06 commented 4 years ago

Vycházel jsem z toho, že mi to takto fungovalo u jiných get/post requestů, nicméně i když tedy předělám syntaxi podle vzoru, tak mi to stále neprojde.

var jsondata = {
                        "$push": {
                            "task": [{
                                "_id": response._id,
                                "code": inputCode,
                                "description": inputDescription,
                                "relevancy": inputRelevancy,
                                "done": inputDone
                            }]
                        }
                    };

                    var put = {
                        "async": true,
                        "crossDomain": true,
                        "url": `https://mycompanydb-704c.restdb.io/rest/employee/${element._id}`,
                        "method": "PUT",
                        "headers": {
                            "content-type": "application/json",
                            "x-apikey": "5deb8ea54658275ac9dc240a",
                            "cache-control": "no-cache"
                        },
                        "processData": false,
                        "data": JSON.stringify(jsondata)
                    }

                    $.ajax(put).done(function (response) {
                        console.log(response);
                    });

Jinak z té dokumentace čerpám a myslím, že body 1 a 2 mám správně od začátku, nejsem si však jistý tím zapsáním v json pro vnořený objekt. V dokumentaci vkládají jen jednu hodnotu do pole, což je jiný případ, než mám já. Tak, jak to mám zapsané já, mi to dává smysl, data se však nepřidají, tak to asi správně nebude, jestli je tedy chyba v téhle části... v jiné ji ale nevidím.

nvbach91 commented 4 years ago

RestDB.io validuje každý požadavek, podívejte se do odpovědi tohoto requestu a uvidíte, kde Vám to neprošlo.

var jsondata = {
    "$push": {
        "task": {
            "_id": '5e20693d4e8532830feb9278',
            "code": '...',
            "description": '...',
            "relevancy": '...',
            "done": '...'
        }
    }
};

var put = {
    "async": true,
    "crossDomain": true,
    "url": `https://mycompanydb-704c.restdb.io/rest/employee/5e20693d4e8532830feb9278`,
    "method": "PUT",
    "headers": {
        "content-type": "application/json",
        "x-apikey": "5deb8ea54658275ac9dc240a",
        "cache-control": "no-cache"
    },
    "processData": false,
    "data": JSON.stringify(jsondata)
}

$.ajax(put).done(function (response) {
    console.log(response);
});

image