当前位置: 首页 > 面试题库 >

MongoDB查询填充字段

方斌
2023-03-14
问题内容

我有要查询的模型(称为“活动”)(使用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'
    }
});

当我询问他们,我填充actorrecipientevent,和comment字段(所有引用)。在那之后,我也深入了这个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会使您的人数迅速增加,并且随着数据集的增长,这很可能会成为问题。



 类似资料:
  • 问题内容: 我有两个表:tbl_listings,其列为:prop_id; 另一个表:tbl_bookings,其列为:prop_id,booking_date。 我想编写一个查询,计算prop_id在tbl_bookings中出现的所有时间,然后用该查询的结果填充tbl_listings中的新列。 我的查询看起来像: 但由于某种原因,我收到一条错误消息:子查询返回多于1行。我该如何解决? 问题答

  • 我看到了许多类似问题的答案,人们说为了获得组合框中加载的项目的值,需要使用 但这种东西不起作用…… 这是我所拥有的…… 我从表中选择了Code1和Code2,我希望能够显示Code1,当被选中时,我希望能有Code2的值,但对于displayMember和ValueMember,我看不到任何结果。 编辑:这是我的所有代码: 暗淡的行=dt. Load(com. Ex 错误提示:表达式不产生值 编辑

  • 问题内容: 一般而言,我对Mongoose和MongoDB还是很陌生,所以我很难确定是否可以进行以下操作: 有更好的方法吗? 编辑 如有任何混淆,我们深表歉意。我想做的是获取所有包含有趣标签或政治标签的商品。 编辑 没有where子句的文档: 使用where子句,我得到一个空数组。 问题答案: 对于大于3.2的现代MongoDB,您可以在大多数情况下用作替代。这也有实际上做加盟,而不是什么“在服务

  • 我有一个简单的SOQL查询,它返回与联系人和活动成员相关的信息。我试图用SOQL查询的结果填充一个自定义对象。但是,在加载Visualforce页面时,我遇到以下错误: 无效的字段活动。活动成员名称 我已经在开发人员控制台中单独运行了SOQL查询,它成功地进行了查询。为什么我不能参加竞选呢。for循环中SOQL查询的名称?

  • 我正在查询Sql Server并返回一个List-我想使用此List作为我的组合框的源。下面是我正在使用的代码,它运行时没有错误,但我的组合框始终为空并且从不填充。这里有什么不正确的? 主要的Java语言 样品fxml

  • 我想用本机查询的结果填充数据传输对象类。但我收到以下错误: 这是我的DTO课 这是我的原生查询。这是一个简单的查询: 我使用的是Spring Data JPA,但我知道在hibernate中存在一个方法setResultTransformer,但我在JPA中找不到类似的方法。 在我的例子中,我需要使用本机查询,因为在其他查询中会使用表值函数。