【发布时间】:2017-11-05 01:48:46
【问题描述】:
有没有办法将异构数组指定为模式属性,其中它可以包含 ObjectId 和字符串?我想要以下内容:
var GameSchema = new mongoose.schema({
players: {
type: [<UserModel reference|IP address/socket ID/what have you>]
}
我自己管理的唯一选项是Mixed 类型吗?我遇到过discriminators,它看起来很有希望,但看起来它只适用于子文档而不是对其他模式的引用。当然,我可以有一个UserModel 引用并创建一个UserModel,它只存储IP 地址或我用来识别它们的任何东西,但这似乎很快就会在空间方面失去控制(我遇到的每个 IP 都有一个模型听起来很糟糕)。
编辑:
例子:
一个游戏有一个登录用户,三个匿名用户,文档应该是这样的:
{ players: [ ObjectId("5fd88ea85...."), "192.0.0.1", "192.1.1.1", "192.2.2.1"] }
理想情况下,这将填充到:
{ players: [ UserModel(id: ..., name: ...), "192.0.0.1", "192.1.1.1", "192.2.2.1"] }
编辑:
我决定走一条不同的路线:我不是混合类型,而是区分不同的属性。像这样的:
players: [
{
user: <object reference>,
sessionID: <string>,
color: {
type: String
},
...other properties...
}
]
我有一个验证器,可确保为给定条目仅填充 user 或 sessionID 之一。在某些方面,这更复杂,但它确实避免了在迭代它们时进行这种条件填充和确定每个条目的类型的需要。我没有尝试任何答案,但它们看起来很有希望。
【问题讨论】:
-
你想用这个做什么?这实际上很重要,因为它取决于您打算做什么。既然您提到了
ObjectId,那么建议您要引用另一个/相同集合中的项目。如果你混合类型,那么像.populate()这样的东西将不起作用。 -
我的目标是允许登录用户或匿名用户加入游戏。登录用户应该有与他们的登录相关联的游戏,匿名用户(显然)没有登录。
populate()是我不确定的事情之一;如果 Mongoose 支持我的用例,那么大概有一种方法可以巧妙地populate仅在数组中那些是 ObjectIds 的条目,但你是说这不会发生? -
是的,我是说这不会发生。与其尝试在 cmets 中进行解释,不如花时间在您的问题中扩展您的用例(最好使用示例数据和期望的结果)。解决问题的一个好方法是不要用“你认为解决方案是什么”来表达它,而是简单地根据最终结果来解释问题你要。为了给出最好的建议,这些要点可能会更清楚,
-
您可以使用mongoose-ajv-plugin 并使用JSON 模式(由AJV library 实现)进行对象验证。这将允许您验证数组,但不会神奇地让您
populate它。免责声明:我是插件的作者。 -
@Jthorpe 这似乎有助于解决“混合”类型的问题,但除非我遗漏了什么,否则似乎没有任何东西可以帮助使用数据所在的
.populate()引用的ObjectId或不相关的“字符串”,如果我阅读正确,这是主要意图。如果您有适用于.populate()的示例,那么我认为这将是一个有用的示例。 AFAIK.populate()对此大发雷霆,但 MongoDB 可以通过一些争论自行“加入”。
标签: node.js mongodb mongoose mongodb-query aggregation-framework