API w nodejs z mongoose - problem z subdocs

0

Witajcie, piszę tutaj ponieważ głowię się od dłuższego czasu czemu to nie działa:

...
mongoose.connect('mongodb://[email protected]:59676/zxcv');
var Schema = mongoose.Schema;
 
var entrySchema = Schema({
    title: String,
    img: String,
    info: String,
    link: String
}, {collection: 'xxx'});
 
var userDataSchema = Schema({
  name: String,
  password: { type: String, select: false},
  birth: Number,
  followers: [{ "name": String}],
  entry: [entrySchema]
}, {collection: 'yyy'});
 
var UserData = mongoose.model('UserData', userDataSchema);
var entry = mongoose.model('entry', entrySchema);
 
app.get('/:user', function(req, res) {
    UserData.findOne( {'name': req.params.user}, function(err, user) {
        if (err)
            res.send(err);
        res.json(user);
    });
});

Owy kod zwraca dane ze schematu userDataSchema oraz pusty entry: []

Jestem w stanie odpytać osobno userDataSchema oraz entrySchema i zwracają poprawne dane, jednak nie działa to razem. Gdzie popełniam błąd? Finalnie chciałbym, aby mongoose dokleił w wyniku do entry dane ze wszystkich kolekcji o nazwie z followers.

1

Hej, musisz jeszcze zaznaczyć fakt, że chcesz dociągnąć dane z tej tabeli za pomocą funkcji populate -> http://mongoosejs.com/docs/populate.html

więc u Ciebie wyglądało by to mniej więcej tak:

UserData
    .findOne( {'name': req.params.user})
    .populate('entry')
    .exec(function(err, user) {
        if (err)
            res.send(err);
        res.json(user);
    });

Daj znać czy pomogło ;-)

0

Tak też zrobiłem i niestety nie przyniosło to żadnych efektów. Dalej zwraca pustą []

1

No to jeszcze spróbujmy przeedytować deklarację tego pola entry w schemacie.

var userDataSchema = Schema({
    name: String,
    password: { type: String, select: false},
    birth: Number,
    followers: [{ "name": String}],
    entry: [{ type: Schema.Types.ObjectId, ref: 'entry' }]
}, {collection: 'yyy'});

Swoją drogą jak zapisujesz w bazie entry to jak wiążesz ze sobą te dwie kolekcje?

0

@DevEnv Dzięki za zainteresowanie. Faktycznie zauważyłem dość duży błąd w rozumowaniu, którym się kierowałem. Pozwolisz, że przybliżę mój problem:
Mam dwa schematy userSchema oraz itemSchema:

var userSchema = mongoose.Schema({
  _id: mongoose.Schema.Types.ObjectId,
  name: { type: String, required: true},
  password: { type: String, select: false, required: true},
  followers: [{ type: String }],
  itemList: [{ type: ObjectId, ref: 'item' }]
}, {collection: 'user'});

var user = mongoose.model('user', userSchema);

var itemSchema = mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    author: { type: String },
    userData: [{ type: ObjectId, ref: 'userData' }],
    item: [{
      _id: mongoose.Schema.Types.ObjectId,
      title: { type: String, required: true},
      date: {  type: String, required: true},
      info: { type: String},
      url: { type: String, required: true },
      img: { type: String }
    }]
}, {collection: 'item'});

var item = mongoose.model('item', itemSchema);

Chciałbym, aby po wejściu na adres GET /:user/item wyszukało mi w bazie user odpowiednią osobę i pobrało z followers wszystkie Stringi, które odpowiadają author z itemSchema. Wynik końcowy ma zwrócić mi wszystkie itemy, których autor zawarty jest w user followers.
Będę bardzo wdzięczny za pomoc ponieważ męczę się z tym już kupe czasu...

1 użytkowników online, w tym zalogowanych: 0, gości: 1