有没有办法指定一个异构数组作为模式属性,它可以同时包含ObjectId和字符串?我想有像下面这样:Mongoose填充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支持,那么大概会有一种方法可以巧妙地“填充”数组中ObjectId中的那些条目,但是你说这不会发生? –
是的,我说这不会发生。不要试图在评论中解释,花点时间在你的问题上扩展你的用例(最好是用示例数据和期望的结果)。解决问题的一个好办法是**不要**用“你认为解决方案是什么”*来表述它,而是用你想要的最终结果来解释问题。为了给出最好的建议,这些要点可能会更清晰, –