【发布时间】:2015-10-10 21:48:21
【问题描述】:
帮助!我正在失去理智。我需要简单地返回一个 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 将不存在。
顺便说一句,我也担心如何正确地构建这个逻辑上的索引。
我会发布 sn-ps,但每次尝试都是错误的。 =(
【问题讨论】:
-
返回那个用户文档然后检查
if (user.deactivation)怎么样?数据的用例将为您指明正确的方向。 -
理论上,如果我只查询 FB ID,然后在返回文档后检查文档,我可能会返回多个文档。来自 RDBMS 世界,我认为正确/最优雅的方法是以某种方式使用索引来查找匹配条件的 ONE 用户。但是,现在我想到了,是否甚至可以在索引中包含子文档信息?嗯...伙计,菜鸟有时很痛苦。 :P
-
您不能通过简单地使用审计字段来完成相同的任务吗?例如,拥有一个
dateDeactivated字段将允许您索引这两个字段,而无需处理子文档。 -
我最近也为一个项目选择了 MongoDB。 Mongoose 为 Node.js 提供了一个非常简单的界面。我发现它还需要开发人员将大部分数据库逻辑转移到应用程序层。在您的情况下,我认为要么返回除密码之外的所有内容,要么只返回 facbook 和 deactivation 并且 if (!deactivation) 为文档发出另一个查询。它并不优雅,但在 NoSQL 领域的查询要快得多。感谢@G.Deward 编辑
-
也许我错过了什么;如果您通过 FB Id 查询,则该字段应限制为唯一。如果它是唯一的,您将使用
findOne()而不是find()。然后,当您返回一个文档时,您就可以在内存中检查它。