如何在没有数组的情况下,为我的嵌套文档的JSON定义一个有效的Mongoose模式?

3

我是一个刚接触JavaScript和Mongoose的新手。我得到了一种设计有些奇怪的JSON格式,我想通过mongoose来持久化它。

以下是此JSON的示例:

{name : "a_string", a1 : {something : 'a_number', something_else : 'a_number'}, a2 : {...} }

a1,a2 是变量(不一定总是有 a1 和 a2,可能还有其他的)。 something,something_else 也是变量,可以是不同的标识符 -它们是属性。

也许这是我设计一个奇怪的 JSON 的错,但最好的定义它的模式的方法是什么?

我有各种选择,但都没有说服我:

Schema {
      myJSON : []
}

这很丑陋,但现在我可以将我的JSON存储为myJSON[0] = {name: "theName"...}。当然这是最丑陋的方式,但是它是我发现的最接近原始数据结构的方式。
另一个例子。
json Schema {
   name: String,
   parts: [part]
}

part Schema {
   name :  String,
   props : [prop]
}

prop Schema {
   name : String,
   value : Numeric
}

这看起来更美观,但我发现有几个问题,最终的JSON会有许多数组和间接引用,这在原始JSON中并没有:

{name :"a_string", parts:[{name : "a1", 
           props : [{name : "something", value: 'a_number'}]},{...}]}

有没有办法从架构中删除所有这些烦人的数组?

更新:

最终我解决了我的问题,因为我对数据模型进行了一些调整:

var mySchema = new Schema({
       name  : String
     , valid   : Boolean
     , parts  : {}
});

然后“props”包含了我想要的所有JSON(除了名称放在外面)。这不是我原本想要的方式,但它还可以(我想)。

1个回答

4

看起来您正在使用mongoose 嵌入式文档

我不确定嵌入式文档是否总是包含在数组中。

按照这个mongoose文档示例:

var Comments = new Schema({
    title     : String
  , body      : String
  , date      : Date
});

var BlogPost = new Schema({
    author    : ObjectId
  , title     : String
  , body      : String
  , date      : Date
  , comments  : [Comments]
  , meta      : {
        votes : Number
      , favs  : Number
    }
});

一篇博客文章可以包含多个评论,而评论将被包装在一个数组中(就像您的问题一样,如果我没记错的话)。
如果在模式定义中摆脱该数组会怎样呢?
使用 Comments 而不是 [Comments]
var BlogPost = new Schema({
    author    : ObjectId
  , title     : String
  , body      : String
  , date      : Date
  , comments  : Comments
  , meta      : {
        votes : Number
      , favs  : Number
    }
});

我现在不能尝试。否则,我有一个使用 mongoose虚拟属性的想法,如果这行不通,请告诉我。 编辑 使用虚拟属性,你可以像这样做:
BlogPost
    .virtual('customComment')
    .get(function() { 
        return this.comments[0]; 
    });

这将返回第一个评论条目对象,而不是数组。
var BlogPost = mongoose.model('BlogPost');

BlogPost
    .find({ title: 'foo' })
    .populate('comments')
    .run(function (err, post) {

    console.log(post.customComment); // returns the first comment without array
});

未经测试,可能包含拼写错误。


是的,嵌入式文档必须包装在数组中 :(. 我想我可以尝试使用虚拟字段进行一些奇怪的修复... 你能详细说明一下你的想法吗?谢谢! - Dredok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接