gpt4 book ai didi

javascript - MongoDB 对填充字段的查询

转载 作者:太空宇宙 更新时间:2023-11-04 02:51:09 25 4
gpt4 key购买 nike

我有一个名为“Activities”的模型,我正在查询(使用 Mongoose)。他们的架构如下所示:

var activitySchema = new mongoose.Schema({
actor: {
type: mongoose.Schema.ObjectId,
ref: 'User',
required: true
},
recipient: {
type: mongoose.Schema.ObjectId,
ref: 'User'
},
timestamp: {
type: Date,
default: Date.now
},
activity: {
type: String,
required: true
},
event: {
type: mongoose.Schema.ObjectId,
ref: 'Event'
},
comment: {
type: mongoose.Schema.ObjectId,
ref: 'Comment'
}
});

当我查询它们时,我会填充actorrecipienteventcomment字段(所有引用)。之后,我还深度填充 event 字段以获取 event.creator。这是我的查询代码:

var activityPopulateObj = [
{ path: 'event' },
{ path: 'event.creator' },
{ path: 'comment' },
{ path: 'actor' },
{ path: 'recipient' },
{ path: 'event.creator' }
],
eventPopulateObj = {
path: 'event.creator',
model: User
};

Activity.find({ $or: [{recipient: user._id}, {actor: {$in: user.subscriptions}}, {event: {$in: user.attending}}], actor: { $ne: user._id} })
.sort({ _id: -1 })
.populate(activityPopulateObj)
.exec(function(err, retrievedActivities) {
if(err || !retrievedActivities) {
deferred.reject(new Error("No events found."));
}
else {
User.populate(retrievedActivities, eventPopulateObj, function(err, data){
if(err) {
deferred.reject(err.message);
}
else {
deferred.resolve(retrievedActivities);
}
});
}
});

这已经是一个相对复杂的查询,但我需要做更多。如果它命中 $or 语句中的 {actor: {$in: user.subscriptions}} 部分,我需要确保 eventprivacy 字段等于字符串 public。我尝试使用 $elemMatch,但由于必须首先填充事件,因此我无法查询其任何字段。我还需要在多个其他查询中实现相同的目标。

有什么方法可以像我所描述的那样实现进一步的过滤吗?

最佳答案

答案是改变你的架构。

您已经陷入了许多开发人员在从使用关系数据库的历史进入文档数据库开发时遇到的陷阱:MongoDB 不是关系数据库,不应该被视为关系数据库。

您需要停止考虑外键和完全规范化的数据,而是让每个文档尽可能独立,考虑如何最好地将相关的关联数据嵌入到文档中。

这并不意味着您也无法维持关联。它可能意味着这样的结构,您只嵌入必要的详细信息,并在需要时查询完整记录:

var activitySchema = new mongoose.Schema({
event: {
_id: { type: ObjectId, ref: "Event" },
name: String,
private: String
},

// ... other fields
});

重新考虑您的嵌入策略将大大简化您的查询并将查询数量保持在最低限度。 populate 会快速增加您的计数,并且随着数据集的增长,这很可能会成为一个问题。

关于javascript - MongoDB 对填充字段的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19572854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com