2012-03-03 79 views
0

我有以下通用模式来表示不同类型的信息。猫鼬 - 递归查询(从多个结果合并)

var Record = new Schema (
{ 
    type: {type: String}, // any string (foo, bar, foobar) 
    value: {type: String}, // any string value 
    o_id: {type:String} 
} 
); 

一些基于此架构中的记录有:

  • TYPE = “车”
  • 值= “法拉利” 或
  • 值= “福特”

有些记录的类型为“topspeed”,值为“210”,但它们总是共享o_id(例如,相关的“ferrari有这个速度”)。所以如果“法拉利拥有最高速度300”,那么两个记录都有相同的o_id。

当我不知道o_id时,如何查询“找到带有topspeed 300的法拉利”?

我发现的唯一解决方案是首先选择汽车“法拉利”,然后知道所有“法拉利”的所有o_id使用它来找到陀飞轮。

伪代码:

Record.find({type:"car", value:"ferrari"}, function(err, docs) 
{ 
    var condition = [];// create array of all found o_id; 
    Record.find({type:"topspeed", value:"300"}... 
} 

我知道,有些合并或连接可能是不可能的,但对于一些链接,这些条件,以避免递归?

编辑: 更好的例子:

  • 让我们来想象我有一个包含某些ID(o_id)DIV元素HTML文档。

  • 现在每个div元素都可以包含不同类型的微数据项(Car,Animal ...)。

  • 每个微数据项具有基于类型不同的性质( “TopSpeed中文”, “numberOfLegs” ...)(车载具有TopSpeed中文,动物numberOfLegs)

  • 每个属性具有一定的值(310公里每小时, 4支脚)

如今,我已把这些微数据到数据库,但在一般的方式,不可知的类型和值它们包含由于用户可以定义从汽车自定义架构,以动物,以漂亮很多东西)。为此,我定义了Record模式:type由“itemtype_propertyname”组成,value是属性的值。

我最终想要同时查询“给我所有包含项目Ferrari和项目Dog的DIV元素的o_id”。

这种通用方法的原因是允许任何人定义自定义模式和存储值的相应分析器。

但是我将只有一个搜索引擎来查找所有不同的模式和值组合,它们将所有可能的模式视为单个定义。

+0

你能详细说明o_id代表什么吗?这是两个记录之间的关系吗?我也觉得很奇怪,你已经在键/值存储区内重新创建了一个键/值存储区(这正是我所想的所有nosql数据库)。也许对您的数据模式的一些讨论可以帮助我们。 – jcollum 2012-03-03 21:10:06

+0

谢谢,我添加了更好的例子 – ladar 2012-03-03 21:56:36

回答

0

我认为将共享o_id的所有记录合并到单个记录中会好得多。例如:

{ 
    _id: ObjectId(...), 
    car: "ferarri", 
    topspeed: 300 
} 

然后你就不会有这个问题,并且你的模式在速度和存储容量上都会更高效。这就是要使用MongoDB的原因 - 异构数据可以存储在一个集合中,因为MongoDB是无模式的。如果您继续使用您当前的设计,那么不会,您无法避免多次往返数据库。