gpt4 book ai didi

node.js - 使用 Mongoose 嵌入文档的建模引用

转载 作者:太空宇宙 更新时间:2023-11-03 23:39:58 25 4
gpt4 key购买 nike

我正在 MongoDB 中对两种类型的事件(事件和子事件)进行建模,如下所示:

var EventSchema = mongoose.Schema({
'name' : String,
'subEvent' : [ SubeventSchema ]
});

var SubeventSchema = mongoose.Schema({
'name' : String
});

现在,当我查询子事件时,我希望也能够检索有关其相应 super 事件的数据,以便使用 Mongoose 群体功能检索的一些示例数据可能如下所示:

EventModel.findOne({
name : 'Festival'
})
.populate('subEvent')
.execute(function (err, evt) { return evt; });

{
name : 'Festival',
subEvent: [
{ name : 'First Concert' },
{ name : 'Second Concert' }
]
}

EventModel.findOne({
'subEvent.name' : 'FirstConcert'
}, {
'subEvent.$' : 1
})
.populate('superEvent') // This will not work, this is the actual problem of my question
.execute(function (err, subevt) { return subevt; });

{
name: 'First Concert',
superEvent: {
name: 'Festival'
}
}

我能想到的解决方案不是嵌入而是像这样引用:

var EventSchema = mongoose.Schema({
'name' : String,
'subEvent' : [ {
'type' : mongoose.Schema.Types.ObjectId,
'ref' : 'SubeventSchema'
} ]
});

var SubeventSchema = mongoose.Schema({
'name' : String,
'superEvent' : {
'type' : mongoose.Schema.Types.ObjectId,
'ref' : 'EventSchema'
}
});

不过,我正在寻找基于使用嵌入式子事件的第一个示例的解决方案。这可以实现吗?如果可以,如何实现?

最佳答案

我认为您的文档嵌入思维模型不正确。主要的误解(这很常见)是“查询子事件”(查询嵌入文档)。根据您当前的 Event 架构,Subevent 只是嵌入在 Event 文档中的文档。嵌入的 SubEvent 不是顶级文档;它不是 MongoDB 中任何集合的成员。因此,您不会查询它。您查询其 subEvents 具有某些属性的 Event(它们是架构中实际的集合级文档)。例如。人们翻译查询的一种方式

db.events.find({ "subEvent" : { "name" : "First Concert" } })

简单的英语就是“查找所有名为“First Concert”的子事件。这是错误的。正确的翻译是“查找至少有一个名为“First Concert”的子事件的所有事件(“至少一个”部分取决于 subEvent 是一个数组的知识)。

回到具体问题,您现在有望看到尝试在子事件上填充“ super 事件”是没有意义的。您的查询返回事件。最佳模式,无论是事件中嵌入的子事件、单独集合中事件和子事件文档之间的单向或双向引用,还是非规范化到组成子事件文档中的事件,都无法根据问题中的信息确定,因为未指定用例。

关于node.js - 使用 Mongoose 嵌入文档的建模引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25763938/

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