首页 > 解决方案 > KeystoneJS 中是否有任何功能可以仅加载一个类别的相关项目?

问题描述

我正在创建一个包含旅游的网站,必须按类别指定,但我不知道如何仅加载与类别相关的旅游。我尝试使用 find().where() 加载它们,但我在所有 3 个类别中加载了所有游览。

KeystoneJS 没有关于任何排序方法的文档,我只找到了两个对我不起作用的示例。

我的trips.js:

let keystone = require('keystone');
let async = require('async');

exports = module.exports = function (req, res) {
    let view = new keystone.View(req, res);
    let locals = res.locals;

    // Set locals
    locals.section = 'tours';
    locals.filters = {
        trip: req.params.trip,
    };
    locals.data = {
        trips: [],
        category: [],
    };

    view.on('init', function (next) {


        keystone.list('TripCategory').model.find().sort('name').exec(function (err, results) {
            locals.data.category = results;
            next(err);

            async.each(locals.data.category, function (category, next) {

                keystone.list('Trip').model.find().where('category', category.name).exec(function (err, results) {
                    locals.data.trips = results;
                    console.log(locals.data.trips);
                    next(err);
                });

            });
        });

    });


    view.render('trips');
};

我的 Trip.js:

let keystone = require('keystone');
let Types = keystone.Field.Types;

let Trip = new keystone.List('Trip', {
    map: { name: 'title' },
    singular: 'Trip',
    plural: 'Trips',
    autokey: { path: 'slug', from: 'title', unique: true },
});

Trip.add({
    title: { type: String, required: true },
    content: {
        brief: { type: Types.Html, wysiwyg: true, height: 150 },
        extended: { type: Types.Html, wysiwyg: true, height: 400 },
    },
    category: { type: Types.Relationship, ref: 'TripCategory' },
    duration: { type: Types.Html, wysiwyg: true },
    distance: { type: Types.Html, wysiwyg: true },
    price: { type: Number },
    images: { type: Types.CloudinaryImages },
    coverImage: { type: Types.CloudinaryImage },
});

Trip.register();

我的 TripCategory.js:

let keystone = require('keystone');
let Types = keystone.Field.Types;

let TripCategory = new keystone.List('TripCategory', {
    autokey: { from: 'name', path: 'slug', unique: true },
});

TripCategory.add({
    name: { type: String, required: true, unique: true },
    description: { type: Types.Html, wysiwyg: false, height: 500 },
});

TripCategory.relationship({ ref: 'Trip', path: 'trips', refPath: 'category' });

TripCategory.register();

标签: javascriptkeystonejs

解决方案


您应该能够使用常规find查询以及populate.

keystone.list('Trip').model.find()
  .populate({path: 'category', options: {sort: {'name'}}})
  .exec(function(err, results) {
      locals.data.trips = results;
   })

这将获取所有行程及其相应的类别信息,并按类别名称对其进行排序。如果此语法给您带来问题(由于 keystonejs 使用的是旧版本的 mongoose),请尝试一些不断发展的不同语法版本。这是一篇详细介绍它们的帖子


推荐阅读