arrays - 具有 2 个(或更多)模式类型的 mongoose 数组

标签 arrays node.js mongodb mongoose schema

根据这个问题的答案, Nested arrays in Mongoose

我想知道是否有一种方法可以在 mongoose 模式中创建一个数组,该数组只接受两种类型的 Schema 定义文档中的一种作为数组中的元素。我这是什么意思?考虑一个定义为...的模式

var MyDocSchema = new Schema({
  name: String,
  stuff: [Stuff],
});

其中的东西被定义为

var Stuff = new Schema({
  name: String,
  value: Number,
});

这行得通,但是如果我想要我的东西怎么办:数组能够包含 Stuff 或 OtherStuff....

var MyDocSchema = new Schema({
  name: String,
  stuff: [Stuff *or* OtherStuff ],
});

其中 Stuff 与之前相同,OtherStuff 定义为

var OtherStuff = new Schema({
  count: Number,
  when: Date,
});

最佳答案

基本上有两种方法可以做到这一点:

  1. 将 Stuff 和 OtherStuff 存储在另一个自己的集合(同一个集合)中,并且只存储字段中对象的 id,然后您可以填充结果。此解决方案的诀窍是您要创建两个指向同一个集合的 mongoose 模型。

    注意:此解决方案适用于大且差异很大的 Stuff 和 OtherStuff 对象(因为 mongoDb 存储启发式),文档计数低(因为填充是一个缓慢的过程)。最终,如果对象非常不同,它们应该有自己的字段。

  2. 使用鉴别器。基本上,您的示例需要三个 document 模式(其他模式保持不变):

    // -- Stuff --
    // Please copy from above
    
    // -- OtherStuff --
    // Please copy from above
    
    // MyDocument -
    var MyDocSchema = new Schema({ name: String });
    
    // MyDocStuff - 
    var MyDocStuffSchema = new Schema({ stuff: [Stuff] });
    
    // MyDocOtherStuff - 
    var MyDocOtherStuffSchema = new Schema({ stuff: [OtherStuff] });
    
    var myDoc = new mongoose.Model( 'myDoc', myDocSchema );
    var myDocStuff = myDoc.discriminator( 'myDocStuff', myDocStuffSchema );
    var myDocOtherStuff = myDoc.discriminator( 'myDocOtherStuff', myDocOtherStuffSchema );
    
    // when writing with this method, you need to know which model is relevant
    // isOtherStuff() just checks for _when_ or _count_ fields
    if( isOtherStuff(doc) ) {
        myDocOtherStuff.create(doc);
    } else {
        myDocStuff.create(doc);
    } 
    

注意:这是与看起来相似的多态对象一起使用的解决方案,对于文档中的大 N 来说速度很快。

关于arrays - 具有 2 个(或更多)模式类型的 mongoose 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22801725/

相关文章:

python - 为什么我的 3D numpy 数组中的值在我将其写入文件时会发生变化?

javascript - 使用 GitLab API 和 Node.js 下载 GitLab 存储库存档

java - 使用 java 、Redis、Elastic Search 、Mongo 自动完成

arrays - 将变体数组转换为动态数组

php - 如何使用 php 删除数组中的特定键?

javascript - 使用环绕在一维阵列网格中查找邻居的更优雅的方法?

javascript - Firebase - Geofire 和云功能。功能结束是否意味着不再有听众?

node.js - 如何从 MEAN Stack 中的 Express get API 中的函数传递信息

node.js - 从nodejs插入日期值到mongodb

mongodb - Meteor find().fetch() 与多个条件不工作