帮助!我正在失去理智。我只需返回 Mongo document
,使用Mongoose
,IF
子文档不存在。
我的架构:
var userSchema = new mongoose.Schema({
email: {type: String, unique: true, lowercase: true},
password: {type: String, select: false},
displayName: String,
picture: String,
facebook: String,
deactivation: deactiveSchema
});
var deactiveSchema = new mongoose.Schema({
when : { type: Date, default: Date.now, required: true },
who : { type: Schema.Types.ObjectId, required: true, ref: 'User' }
});
我的目标是通过facebook
ID查找用户,如果他们尚未停用。
如果 已停用,则会存在deactivation
子文档。当然,为了节省空间,如果它们处于活动状态,则deactivation
将不存在。
另外,我还担心如何在此逻辑上正确构建索引。
我发布了片段,但每次尝试都是错误的。 =(
答案 0 :(得分:1)
您可以使用$exists
运算符:
userSchema.find({deactivation:{$exists:false}}).exec(function(err,document){
});
或$ne
:
userSchema.find({deactivation:{$ne:null}}).exec(function(err,document){
});
答案 1 :(得分:1)
由于您要停用数据而不是删除,我采用以下两种方法之一:
退役的标志 (推荐)
添加到您的架构:
retired: {
type: Boolean,
required: true
}
并为此查询添加索引:
userSchema.index({facebook: 1, retired: 1})
和查询:
User.find({facebook: facebookId, retired: false}, callback)
查询存在
User.find().exists("deactivation", false).exec(callback)
后者会慢一些,但如果你真的不想改变什么,那就行了。我建议您花些时间阅读mongo文档的indexing部分。
答案 2 :(得分:0)
Mongoose有许多选项可用于定义具有条件的查询和几种用于编写查询的样式:
Expected: ["abc 123\nabc 123\nabc 123\ntest xyz","abc 123\nabc 123\nabc 123\ntest xyz"]
Chrome: ["abc 123\nabc 123\nabc 123\ntest xyz","abc 123\nabc 123\nabc 123\ntest xyz"]
IE9: ["abc 123\nabc 123\nabc 123\ntest xyz","abc 123\nabc 123\nabc 123\ntest xyz"]
http://mongoosejs.com/docs/queries.html
或者,如果您正在寻找更接近SQL的东西,您可能希望使用查询构建器语法。 e.g:
var id = "somefacebookid";
var condition = {
facebook : id,
deactivation: { $exists : true}
};
user.findOne(condition, function (e, doc) {
// if not e, do something with doc
})