【问题标题】:The right way to use fineOne(), find() functions in MonkMonk中fineOne()、find()函数的正确使用方法
【发布时间】:2019-09-06 19:39:45
【问题描述】:

我正在使用 expressjs 和 Monk 构建一个 RESTful API。有一个要求,我应该从不同的集合(一对多)中获取多个文档。但我不确定如何实现它。

例如,我需要从 Cars 集合中获取一辆车信息,并从 Wheels 集合中获取 4 个轮子。我知道我应该使用 findOne() 来查找汽车,然后我可以从那里访问轮子的类型。

代码是这样的

var wheelType;
cars.findOne({_id: "C300"}).then((car) => {
  wheelType = car["wheeltype"];
})

这就是重点。我现在有了汽车信息,但我无法在范围之外定义一个变量来保存值,并启动一个新的 find() 函数来收集车轮信息。

当然,我可以尝试像这样在 .then() 中做所有事情

cars.findOne({_id: "C300"}).then((car) => {
  wheels.findOne({type: car["wheeltype"][0] }).then((wheel) => {
    // combind the car with wheel
  })
})

但是,如果我要收集更多详细信息怎么办?我只嵌套 findOne() 函数吗?

我可能将 MySQL 的想法错误地适用于 MongoDB(还有其他方法可以实现一对多映射?)。我期待这样的事情:

收集我们拥有的汽车

{
  {
    name:"c300",
    wheeltype:["A","B","C"]
  }
  {
    name:"R100",
    wheeltype:["E","F","C"]
  }
}

我们拥有的收集轮

{
  {
    type:"A",
    Brand:"BestWheel"
  }
  {
    type:"C",
    Brand:"GoodWheel"
  }
}

在操作之后,我将其作为输出

{
   name:"c300",
   wheel:{
           Brand:"BestWheel",
           type:"A"
          }
}

【问题讨论】:

  • 如果我是正确的,你有一个对象数组,对吧?在 Mongo 中,就是这样。
  • 是的,我可能应该使用[<Wheel>...] 来表示它。我在这里简化了问题,但是对于我的大部分代码,数组中的元素只是指向其他集合中文档的 ObjectID
  • 那么您介意更新对象吗?我认为这比你想象的要容易,但你需要做一些事情来简化你的生活。据我了解,每种类型都与一个品牌有关,对吧?例如A 型是 BestWheel。另外,第二个问题,你可以修改 Mongo 中的对象还是设置它们,你只需要从中收集数据?
  • 我想我误解了你。当您说对象时,我假设您正在谈论集合中的文档。然后,我的问题应该是“我们如何在 Monk 中进行对象关系映射。更改问题中的内容仍然可以吗?由于结构在需求规范中,我只能在 Mongo 中进行很少的更改。跨度>
  • 抱歉没有回复我昨天生病了。你设法解决了吗?如果没有,我会帮助你。

标签: javascript node.js mongodb express monk


【解决方案1】:

我发现嵌套 findOne() 函数是合理的,因为它是一个异步回调函数。那么对于这个问题,如果你想实现类似需求的东西,嵌套是必要的。

cars.finOne(...).then((car) =>{
  wheels.findOne(...).then((wheel) =>{
    // create a json that contains wheels in a car object.
  }
}

【讨论】:

    猜你喜欢
    • 2014-09-26
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    相关资源
    最近更新 更多