javascript - 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();
解决方案
您应该能够使用常规find
查询以及populate
.
keystone.list('Trip').model.find()
.populate({path: 'category', options: {sort: {'name'}}})
.exec(function(err, results) {
locals.data.trips = results;
})
这将获取所有行程及其相应的类别信息,并按类别名称对其进行排序。如果此语法给您带来问题(由于 keystonejs 使用的是旧版本的 mongoose),请尝试一些不断发展的不同语法版本。这是一篇详细介绍它们的帖子
推荐阅读
- excel - 多列作为一个范围 - Worksheet_Change - 条件格式的替代方案
- android - 如何使用 RecyclerView 的 SmoothScrollToPosition 滚动并在 recyclerview 中使用动态位置?
- nosql - 具有一对多关系和选择分区键的 NoSQL 数据库设计
- javascript - 我将如何在此列表中显示每个人员选择器的标题
- asp.net - 如何使用 FromBody 发布 json
- ruby-on-rails - 如何在 Rails 6 的 ActiveRecord 中使用西里尔字母进行不区分大小写的搜索?
- kubernetes - 如何在安装了 kubeadm 的 Kubernetes 集群上配置 Ingress Controller
- css - css字体规则中的“normal normal medium 45px/61px Oswald”是什么意思?
- c - 存储从函数传递的函数指针
- javascript - 使用正则表达式获取过滤后的数组