node.js - mongoose如何基于关联表进行筛选并分页

浏览:45日期:2023-06-12

问题描述

问题背景

如下两个schema

Columns: { active: Boolean, name: String}News: { column: {type: Schema.Types.ObjectId, ref: ’columns’}, title: String, content: String}

column 中 active有被配置修改的需求,news表存在大量插入需求

问题描述

如何对news进行分页查询,查询条件为column.active为true?

如何对查询条件进行count?

解决尝试

1.

News.find().populate({ path: ’column’, match: { active: true } }).limit(10).skip(0).exec(function(err, news) { if (err) { console.log(err); } else { console.log(news); } });

输出结果:

news:[ { 'title': '这篇资讯的所属栏目正在开放', 'column': { 'active': true, 'createdAt': '2017-04-11T10:35:29.747Z', 'id': '58ecc960a4db1e3fc01c2d6d' }, 'updatedAt': '2016-11-29T08:55:42.000Z', 'id': '5923ab21415f8f3bc43f8515' }, { 'title': '这篇资讯的所属栏目已被屏蔽', 'column': null, 'updatedAt': '2016-11-29T08:47:18.000Z', 'id': '5923ab21415f8f3bc43f83bd' }]

期望获取的结果是只有column中active为true的数据尝试失败

问题解答

回答1:

1,您说的这种情况,populate就是这样子的,所以大部分时候populate做一个document的关联的时候很好用,但是做多个document满足条件的关联,就是您遇到的这种情况,没有关联上的,会返回null。

2,建议您在data model上做修改如下:

1)您使用的data model方法是reference的方法,是传统的范式建模的方法。在MongoDB里面用起来比较辛苦;

2)不妨考虑使用反范式建模。名字听起来很高级,就是使用sub-document来实现关联。在您的需求中,将columns作为子文档嵌入到news当中,做起来更简单一些。

供参考。

Love MongoDB! Have fun!

相关文章: