使用没有数组的嵌套文档为我的 JSON 定义有效的猫鼬模式?

Posted

技术标签:

【中文标题】使用没有数组的嵌套文档为我的 JSON 定义有效的猫鼬模式?【英文标题】:Defining a valid mongoose schema for my JSON with nested docs without arrays? 【发布时间】:2012-07-05 16:28:57 【问题描述】:

我对 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 的最佳方法是什么?

我有多种选择,但都不能说服我:

Schema 
      myJSON : []

这非常难看,但现在我可以将我的 JSON 存储为 myJSON[0] = name: "theName"...。 Ofc 是最丑陋的,但与我的原始数据结构最接近。

另一个

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'],...]

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

更新:

我终于解决了我的问题,因为我可以稍微调整一下我的数据模型:

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

然后“道具”包含我想要的所有JSON(除了名称放在外面)。这不是我想要的方式,但它工作正常(我认为)。

【问题讨论】:

【参考方案1】:

看起来你正在使用猫鼬embedded documents。

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

按照这个猫鼬文档示例:

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
    
);

一个 BlogPost 可以包含多个评论,评论将被包装在一个数组中(如果我是对的,就像你的问题一样)。

如果在架构定义中去掉那个数组会怎样?

使用Comments 代替[Comments]

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

我现在不能尝试。

否则,我有一个使用mongoose virtual attributes 的想法,如果这不起作用,请告诉我。

编辑

使用虚拟属性,你可以做这样的事情:

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
);

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

【讨论】:

是的,嵌入的文档必须包含在数组中 :(。我想我可以尝试使用 virtuals 进行一些奇怪的修复......你能详细说明你的想法吗?谢谢!

以上是关于使用没有数组的嵌套文档为我的 JSON 定义有效的猫鼬模式?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:将 DataFrame 与嵌套数组结合或合并 JSON 输出

如何使用材料角度将嵌套的json数组显示到html表中

如何在嵌套数组中使用 apex_json.get_count

PHP/MariaDB 使用嵌套 JSON 数组进行重复键更新

嵌套的 JSON 对象 - 我必须对所有内容使用数组吗?

使用 Dart 语言解析嵌套 JSON 数组并将其放入模型类中