使用没有数组的嵌套文档为我的 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 输出
如何在嵌套数组中使用 apex_json.get_count