Заполнить виртуалы не похоже на работу. Может ли кто-нибудь показать мне ошибку? - PullRequest
0 голосов
/ 26 марта 2020

Я изучаю виртуальные сообщества: https://mongoosejs.com/docs/populate.html#populate -виртуалы

require("./connection");

// //----------------------------------------------------
const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const PersonSchema = new Schema({
  name: String,
  band: String
});

const BandSchema = new Schema({
  name: String
});

BandSchema.virtual("members", {
  ref: "Person", // The model to use
  localField: "name", // Find people where `localField`
  foreignField: "band", // is equal to `foreignField`
  // If `justOne` is true, 'members' will be a single doc as opposed to
  // an array. `justOne` is false by default.
  justOne: false,
  options: { sort: { name: -1 }, limit: 5 } 
});

const Person = mongoose.model("Person", PersonSchema);
const Band = mongoose.model("Band", BandSchema);

/**
 * Suppose you have 2 bands: "Guns N' Roses" and "Motley Crue"
 * And 4 people: "Axl Rose" and "Slash" with "Guns N' Roses", and
 * "Vince Neil" and "Nikki Sixx" with "Motley Crue"
 */
// Person.create([
//   {
//     name: "Axl Rose",
//     band: "Guns N' Roses"
//   },
//   {
//     name: "Slash",
//     band: "Guns N' Roses"
//   },
//   {
//     name: "Vince Neil",
//     band: "Motley Crue"
//   },
//   {
//     name: "Nikki Sixx",
//     band: "Motley Crue"
//   }
// ]);

// Band.create([{ name: "Motley Crue" }, { name: "Guns N' Roses" }]);
/////////////////////////////////////////////////////////////////////////

Band.find({})
  .populate("members")
  .exec(function(error, bands) {
    /* `bands.members` is now an array of instances of `Person` */
    console.log(bands.members);
  });

Однако, вывод этого кода undefined; учебник mon goose утверждает, что это должен быть "массив экземпляров Person".

Я протестировал другой код, но получил похожие результаты: http://thecodebarbarian.com/mongoose-virtual-populate.html

Первое: кто-нибудь может сообщить мне, что не так в этом коде ? Я не вижу этого!

Второе: если он не требует слишком многого, может кто-нибудь попытаться показать мне важность этой техники. Они утверждают, что это лучше, чем обычное население в отношении скорости, я не могу видеть это при моем текущем знании goose!

Смежный вопрос: Пн goosejs виртуальное заполнение

1 Ответ

0 голосов
/ 27 марта 2020

Ответ был прямо перед моими глазами! Вопрос, на который я имел отношение, а именно, имеет ответ в конце концов: Пн goosejs виртуальное население

Чтобы сохранить дух обучения, я суммирую здесь решение ,

Согласно официальной документации:

If you use toJSON() or toObject() mongoose will not include virtuals by default.

См .: https://mongoosejs.com/docs/guide.html#virtuals.

Честно говоря, я понятия не имею, что это значит, но это было включено в комментарий, и, кажется, ответ!

Итак, что нужно сделать, это включить строку:

BandSchema.virtual("members", {
  ref: "Person", // The model to use
  localField: "name", // Find people where `localField`
  foreignField: "band", // is equal to `foreignField`
  // If `justOne` is true, 'members' will be a single doc as opposed to
  // an array. `justOne` is false by default.
  justOne: false,
  options: { sort: { name: -1 }, limit: 5 }
});
//----------------------------------------------------------------    
//here, this one! 
    BandSchema.set("toObject", { virtuals: true });
    BandSchema.set("toJSON", { virtuals: true });

//------------------------------------------

Я изучал официальный учебник mon goose, "серьезно ?! Ребята, вы можете улучшить!" Я нашел это сложным.

...