mongoose查询可以以populate里的条件对要查询的表进行筛选吗?
发布于 7 年前 作者 tomoya92 9535 次浏览 来自 问答

比如表blog里有个user引用

new Schema({
	title: {
		type: String,
		unique: true
	},
	content: String,
	in_time: {
		type: Date,
		default: Date.now
	},
	user: {
		type: Schema.Types.ObjectId,
		ref: 'user'
	}
});

user里有个字段是isDelete

new Schema({
	isDelete: {type: Boolean, default: false}
});

现在我想在查询的时候对user进行筛选,user状态为删除的(isDelete: true) 博客不要查询出来

Blog.find({}).populate({
	path: 'user',
	match: {isDelete: false}
}).exec()

这样查询出来的数据还是全部的博客,但用户被删除的博客里的user字段没数据了

我想要的是用户被删除了的博客直接就不要被查询出来了,这样的需求mongoose可以实现吗?

19 回复

查两次,ref 的是另一个表的 _id

@klamtlne 不是太明白,可以举个例子吗?谢谢

@liygheart 我刚刚看了文档,你说的这个需求是应该是支持的, http://mongoosejs.com/docs/api.html,我晚上会看,再看看有没有

另外你也可以自己写查询方法, 用关联表。

new Schema({
	blog: {
		type: Schema.Types.ObjectId,
		ref: 'blog'
	}
	delete: Bool,
	user: {
		type: Schema.Types.ObjectId,
		ref: 'user'
	}
});

@hi363138911 用一个中间表吗?这种做法我不太喜欢。。api我也翻了,没找到可用的方法

可以加个middleware,在 blogSchema.post(‘find’) 中过滤一下。

@beyond5959 那样的话分页就不好弄了

先把user里面被删除的用户id都找出来放在数组里。 然后在Blog的find条件里面加上一个user不在之前查询出来的这个列表里的条件

@backcj 这是个下策,不过也没啥好办法了

@liygheart 是的,我今天也遇到了类似问题,找了半天没能找到什么有用的东西,然后就只能这么分两步来了

其实我觉得你的数据库有点问题,你的需求是 一个博客绑定的有user那么user isDelete: true 的时候,user已经删除那么对应user下的blog也应该查不出来 那么这样的话为什么在blog表不加入一个isDelete字段呢?当user删除的时候同样将user对应下的blog 也isDelete:true

@hewentaowx 对于这个问题,我也试过,但跟用户关联的表多了的话,标记一个用户的状态就要处理好多的表数据 ,这样会很麻烦呀

@liygheart 哈哈 有些地方麻烦一点其他地方就好做一点 不过你找到好办法没呀 分享一下

那我觉得逻辑应该是

User.find({isDelete:false},(err,users)=>{
 	//.... users.ids  将user的id 搞成数组
 	Bolg.find({user:{$in:users.ids}}).populate({
 		path: 'user'
	}).exec()
})

或者直接在最后 对结果处理下,将没user的去掉

@hewentaowx 我没找到什么好办法,8楼说的是个法子,我觉得也是比较能接受的办法了

@yuk320 你这方法跟8楼说的一样

先populate,再用where筛选this.user符合条件的 不要造populate中筛选,否则只会筛选user

从查询效率来说,我更愿意在删除user时就把关联的表也都标记状态了,毕竟查询是频繁的,应该尽量优化和简单

@tomoya92 我想知道楼主最后用的神马方案?

回到顶部