Mongoose - 递归查询(从多个结果合并)

时间:2012-03-03 20:52:45

标签: javascript mongodb mongoose

我有以下通用架构来表示不同类型的信息。

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

基于此架构的一些记录包含:

  • 类型= “汽车”
  • value =“ferrari”或
  • 值= “福特”

有些唱片的类型为“topspeed”,其值为“210”,但它们总是共享o_id(例如相关的“法拉利有此最高速度”)。因此,如果“法拉利的最高速度为300”,则两个记录都具有相同的o_id。

当我不知道o_id时,怎样才能查询“ferrari with 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"}...
}

我知道某些合并或加入可能是不可能的,但有些链接这些条件以避免递归呢?

编辑: 更好的例子:

  • 假设我有一个HTML文档,其中包含具有特定id(o_id)的DIV元素。

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

  • 每个微数据项目都有不同的属性(“topspeed”,“numberOfLegs”......)基于类型(Car有一个topspeed,动物numberOfLegs)

  • 每个属性都有一些值(310公里/小时,4条腿)

现在我将这些微数据项目保存到数据库中,但是以一般方式,不知道它们包含的类型和值,因为用户可以定义从Car到Animal的自定义模式,几乎任何东西。为此我定义了Record模式:type由“itemtype_propertyname”组成,value是属性的值。

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

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

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

1 个答案:

答案 0 :(得分:0)

我认为将所有共享o_id的记录合并到一条记录中要好得多。 E.g:

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

然后您将不会遇到此问题,并且您的架构在速度和存储大小方面都会更有效。这就是MongoDB的用途 - 异构数据可以存储在一个集合中,因为MongoDB是无模式的。如果你继续使用当前的设计,那么不,没有办法避免多次往返数据库。