我正在使用Meteor和MongoDB,正如文档中所建议的那样。来自关系数据库背景,我想了解在NOSQL存储中建模数据的策略。
方案是我有users
,每个user
都有一个vin
。一切都很标准,可以与一个系列。但是,如果我想找到最高vin
来显示一些关于最近购买的汽车的匿名信息,我是否只想构建一个像:
Users.find({}, sort: {vin_number: -1})
还是有更好的方法来建模吗?如果给定用户有多个vin
怎么办?在一个关系世界中,这是一种“有许多”的关系。但是,如果我在用户文档中嵌入vins
数组,我怎么能提取最高数字。
正如您所看到的,我正在努力解决从将事物建模为嵌入式文档的根本转变。
任何帮助都表示赞赏,并且(虽然我知道这不是SO方式)但我喜欢任何可以从关系建模模式轻松迁移到无模式的地方的指针。
答案 0 :(得分:1)
您可以使用转换从vins列表中获取最高的vin:
Users.find({}, {sort: {vin_number: -1}, transform: function(doc) {
doc.vin_number = _.max(doc.vin_number_array);
return doc;
}})
我从来没有尝试过这个,我有点不确定变换或排序是否是第一位的。但是,如果您的文档中vin_number_array
中有一系列vin数字,则vin_number
最终会成为使用下划线max
函数的最高者。
答案 1 :(得分:1)
对于数组字段,您可以在聚合框架中使用指令$unwind
。它可以创建不同的项目,您可以像往常一样轻松地将其过滤掉。
例如,您的项目与此类似:
{_id: 'KJDKDSJKSJDK', type: 'car', manufacturer: 'opel', model: 'vectra', vins: [1234,5678]}
展开将为此投影创建两个新项目:
{_id: 'KJDKDSJKSJDK', type: 'car', manufacturer: 'opel', model: 'vectra', vins: 1234}
{_id: 'KJDKDSJKSJDK', type: 'car', manufacturer: 'opel', model: 'vectra', vins: 5678}
正如您所见,数组字段已更改为int。