1

按照文档的建议,我正在使用 Meteor 和 MongoDB。来自关系数据库背景,我想了解在 NOSQL 存储中建模数据的策略。

场景是我有users,每个user人都有一个vin。所有这些都非常标准,并且可以通过一个系列来实现。但是,如果我想找到最高vin的以显示有关最近购买的汽车的一些匿名信息,我是否只需构建一个像这样的查找:

Users.find({}, sort: {vin_number: -1})

还是有更好的建模方法?如果给定的用户有多个vin怎么办?在关系世界中,这是一种“有很多”关系。但是如果我在用户文档中嵌入一个数组,vins我怎么能提取最大的数字。

如您所见,我正在努力应对从表格建模到嵌入式文档的根本转变。

感谢您提供任何帮助,并且(尽管我知道这不是 SO 方式)我喜欢任何指向从关系建模模式到无模式模式的温和迁移的地方的指针。

4

2 回答 2

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功能的最高数字。

于 2013-08-20T00:54:30.990 回答
1

对于数组字段,您可以$unwind在聚合框架中使用指令。它会从您的项目中创建不同的项目,您可以像往常一样轻松地对其进行过滤。

聚合框架

例如,您有与此类似的项目:

{_id: 'KJDKDSJKSJDK', type: 'car', manufacturer: 'opel', model: 'vectra', vins: [1234,5678]}

unwind 将为这个投影创建两个新项目:

{_id: 'KJDKDSJKSJDK', type: 'car', manufacturer: 'opel', model: 'vectra', vins: 1234}

{_id: 'KJDKDSJKSJDK', type: 'car', manufacturer: 'opel', model: 'vectra', vins: 5678}

如您所见,数组字段已更改为 int。

于 2013-08-20T10:45:51.660 回答