使用Mongoose返回Mongo文档,其中子文档不存在?

时间:2015-10-09 16:46:26

标签: node.js mongodb mongoose

帮助!我正在失去理智。我只需返回 Mongo document,使用MongooseIF子文档不存在。

我的架构:

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存在。

另外,我还担心如何在此逻辑上正确构建索引。

我发布了片段,但每次尝试都是错误的。 =(

3 个答案:

答案 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
})