比如表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可以实现吗?
查两次,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我也翻了,没找到可用的方法
mark
可以加个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 我想知道楼主最后用的神马方案?