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

Zwrot JSONa z MongoDB

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
528 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 415 wizyt
pytanie zadane 22 stycznia 2018 w JavaScript przez Anoonymous Obywatel (1,560 p.)
+1 głos
0 odpowiedzi 366 wizyt
pytanie zadane 24 czerwca 2016 w JavaScript przez ShiroUmizake Nałogowiec (46,300 p.)
0 głosów
1 odpowiedź 515 wizyt
pytanie zadane 9 czerwca 2018 w JavaScript przez Mebya Użytkownik (700 p.)

93,434 zapytań

142,429 odpowiedzi

322,662 komentarzy

62,799 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

...