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

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

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(名称放在外面)。这不是我的想法,但它工作正常(我认为)。

4

1 回答 1

4

看起来您正在使用 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
    }
});

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

如果你在模式定义中去掉那个数组怎么办?

使用Comments而不是[Comments]

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

我现在不能这样尝试。

否则,我有一个使用猫鼬虚拟属性的想法,如果这不起作用,请告诉我。

编辑

使用虚拟属性,您可以执行以下操作:

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

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

于 2012-07-05T10:34:05.183 回答