• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zwrot JSONa z MongoDB

Object Storage Arubacloud
0 głosów
232 wizyt
pytanie zadane 20 stycznia 2018 w JavaScript przez Anoonymous Obywatel (1,560 p.)

Witam, mam takiego jsona:

{
    "name": "xxx",
    "password": "xxx",
    "birth": xxx,
    "entry": [
        {
            "title": "xxx",
            "img": "xxx",
            "info": "xxx",
            "link": "xxx"
        },
...
    ]
}

Chciałbym za pomocą mongoose zwrócić taki wynik tylko danych z entry bez jego nazwy tzn:

        {
            "title": "xxx",
            "img": "xxx",
            "info": "xxx",
            "link": "xxx"
        },
        {
            "title": "xxx",
            "img": "xxx",
            "info": "xxx",
            "link": "xxx"
        }

Jak mogę uzyskać owy efekt? Jedynie co mi się udaje to dostać owy zwrot wraz z "przedrostkiem" entry: jednak chciałbym go uniknąć.

1 odpowiedź

+1 głos
odpowiedź 20 stycznia 2018 przez Ivan Maniak (60,650 p.)
wybrane 21 stycznia 2018 przez Anoonymous
 
Najlepsza
const fooo = Foo.find( {} ).select( 'entry' ).exec();

W select podajesz jakie pola mają być wyciągnięte.

komentarz 20 stycznia 2018 przez Anoonymous Obywatel (1,560 p.)
  Foo.find({}).select('entry').exec()
      .then(function(doc) {
        res.send(doc);
      });

Kod ma wyglądać w taki sposób? Dokładnie tak zwraca mi:

entry:
1
    "title": "xxx",
    "img": "xxx",
    "info": "xxx",
    "link": "xxx"
,
2
    "title": "xxx",
    "img": "xxx",
    "info": "xxx",
    "link": "xxx"

Chciałbym, aby wynik zwrotny nie zwracał napisu entry, a jedynie jego zawartość (tylko ją)

1
komentarz 21 stycznia 2018 przez Ivan Maniak (60,650 p.)

Nie wiem, czy w samym Mongodb to zrobisz, ale w JS już tak.

Foo.find({}).select('entry').exec()
    .then(function(doc) {
      const data = doc.map( el => el.entry );
      res.send(data);
    });

doc zwraca nam tablicę elementów. Metoda map, najłatwiej tłumaczy to MDN :)

komentarz 21 stycznia 2018 przez Anoonymous Obywatel (1,560 p.)

efekt jest prawie taki jak oczekiwałem tzn. wyświetlają się elementy z entry, ale są zagnieżdżone, a nie na 'górze". Aktualnie wygląda to tak:

[
  [
    {
      "title": "xxx",
      "img": "xxx",
      "info": "xxx",
      "link": "xxx"
    },
    {
      "title": "xxx",
      "img": "xxx",
      "info": "xxx",
      "link": "xxx"
    }
  ]
]

 

1
komentarz 21 stycznia 2018 przez Ivan Maniak (60,650 p.)
res.json( data[ 0 ] );

P.S Gdy wysyłasz JSON to używaj .json, a nie .send.

komentarz 21 stycznia 2018 przez Anoonymous Obywatel (1,560 p.)
Teraz działa jak powinno. Dzięki wielkie!
komentarz 21 stycznia 2018 przez Anoonymous Obywatel (1,560 p.)

@Ivan, pozwolisz, że dopytam:

co jeśli chciałbym, aby działało to dynamicznie? Używam expressjs oraz mongoose:

app.get('/entry/:user', function(req, res) {
  Foo.findOne({'name': req.params.user}).select('entry').exec()
      .then(function(doc) {
        const data = doc.map( el => el.entry );
        res.json(data[0]);
      });
});

Niestety nie wyświetla nic - ciągłe ładowanie strony bez błędu.

komentarz 21 stycznia 2018 przez Ivan Maniak (60,650 p.)

Spróbuj wyświetlić co zwraca doc (czy w ogóle do tego program dochodzi). Zakładam, że Foo to model, który stworzyłeś itd.

app.get('/entry/:user', function(req, res) {
  Foo.findOne({'name': req.params.user}).select('entry').exec()
      .then(function(doc) {
        console.log( doc );
        const data = doc.map( el => el.entry );
        res.json(data[0]);
      });
});

 

komentarz 21 stycznia 2018 przez Anoonymous Obywatel (1,560 p.)

Tak, doc zwraca jsona:

{ _id: xxx,
  entry: 
   [ { link: 'xxx',
       info: 'xxx',
       img: 'xxx',
       title: 'xxx' },
... ]
 }

 

komentarz 21 stycznia 2018 przez Ivan Maniak (60,650 p.)

Jesteś pewien, że wszystko oprócz pobierania z bazy jest OK? Nie ma żadnego komunikatu w konsoli? Jesteś połączony z bazą?

app.get('/entry/:user', async (req, res) => {
  const foos = await Foo.findOne({'name': req.params.user})
    .select('entry')
    .exec();

  const data = foos.map( el => el.entry );
  res.json(data[0]);
});

Spróbuj wrzucić to w taki sposób, nie powinno mieć znaczenia czy używamy async/awai, czy .then. Ale tak dla pewności ;)

komentarz 21 stycznia 2018 przez Anoonymous Obywatel (1,560 p.)
foos.map is not a function
1
komentarz 21 stycznia 2018 przez Ivan Maniak (60,650 p.)
Pokaż swój kod.
komentarz 21 stycznia 2018 przez Anoonymous Obywatel (1,560 p.)
...
mongoose.connect('mongodb://123:123@123/123');
var Schema = mongoose.Schema;

var userDataSchema = new Schema({
  name: String,
  password: { type: String, select: false},
  birth: Number,
  entry: [{
    title: {type: String},
    img: {type: String},
    info: {type: String},
    link: {type: String}
  }]
}, {collection: 'zxcv'});

var UserData = mongoose.model('UserData', userDataSchema);

app.get('/entry/:user', async (req, res) => {
  const foos = await UserData.findOne({'name': req.params.user})
    .select('entry')
    .exec();

  const data = foos.map( el => el.entry );
  res.json(data[0]);
});

 

1
komentarz 21 stycznia 2018 przez Ivan Maniak (60,650 p.)

findOne zwraca jeden document/collection. Zamień findOne na find.

komentarz 21 stycznia 2018 przez Anoonymous Obywatel (1,560 p.)
eh... faktycznie logiczne, a siedzę nad tym już dobrą godzinę :)

Dzięki raz jeszcze!

Podobne pytania

0 głosów
0 odpowiedzi 344 wizyt
pytanie zadane 22 stycznia 2018 w JavaScript przez Anoonymous Obywatel (1,560 p.)
+1 głos
0 odpowiedzi 332 wizyt
pytanie zadane 24 czerwca 2016 w JavaScript przez ShiroUmizake Nałogowiec (46,300 p.)
0 głosów
1 odpowiedź 369 wizyt
pytanie zadane 9 czerwca 2018 w JavaScript przez Mebya Użytkownik (700 p.)

92,550 zapytań

141,394 odpowiedzi

319,522 komentarzy

61,935 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...