【问题标题】:Mongoose - recursive query (merge from multiple results)Mongoose - 递归查询(从多个结果合并)
【发布时间】:2015-11-13 14:35:59
【问题描述】:

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

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

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

  • type="汽车"
  • value="法拉利" 或
  • value="福特"

一些记录的类型为“topspeed”,值为“210”,但它们总是共享 o_id(例如,相关的“ferrari has this topspeed”)。所以如果“ferrari has top speed 300”,那么两条记录都有相同的o_id。

当我不知道 o_id 时,如何查询“法拉利 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 元素都可以包含不同类型的微数据项(汽车、动物...)。

  • 每个微数据项都有不同的属性(“topspeed”、“numberOfLegs”...),具体取决于类型(汽车有最高速度,动物 numberOfLegs)

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

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

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

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

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

【问题讨论】:

  • 你能详细说明一下o_id代表什么吗?是不是两个记录之间的关系?我还觉得奇怪的是,您在键/值存储中重新创建了一个键/值存储(我认为所有 nosql 数据库都是如此)。也许对您的数据架构进行一些讨论会对我们有所帮助。
  • 谢谢,我添加了可能更好的例子

标签: javascript mongodb mongoose


【解决方案1】:

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

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

那么你就不会有这个问题,而且你的架构在速度和存储大小上都会更有效率。这就是 MongoDB 的用途——异构数据可以存储在单个集合中,因为 MongoDB 是无模式的。如果您继续当前的设计,那么不,没有办法避免多次往返数据库。

【讨论】:

    猜你喜欢
    • 2020-11-25
    • 2021-04-29
    • 2016-09-28
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多