【问题标题】:Mongodb, using data context when updateMongodb,更新时使用数据上下文
【发布时间】:2014-08-06 06:39:15
【问题描述】:

我想知道我们更新时是否可以使用当前数据上下文。

collection.update({_id: id},
  {$set:
    {'tmp.$.data': (function(){
      return this.a + this.b})()},
  {multi:true});

在 set 操作中,我尝试用 IIFE 函数和 'this' 关键字计算一些东西, 但是我什么也得不到,因为 IIFE 范围位于更新范围之外。 (a & b 是该对象中的一个项目。)

这就是我想做的。

如果我们可以在更新时控制一些数据,我认为操作集合真的很有用。

有人知道吗?

提前致谢-

ps。我将此问题更新为 js 版本。

【问题讨论】:

  • 什么是@a@b?如果这些是封闭函数中 this 上的变量,则可以使用“胖箭头” - do => 而不是 do -> - 绑定函数表达式的上下文。尽管在update 调用之外执行data = @a + @b 可能更简单,但只需$set: 'tmp.$.data': data
  • 谢谢。我测试了 => 关键字并打印了这个,但它似乎没有任何有用的信息。
  • 所以看起来更新调用在方法内部。 ab 是什么?它们是文档本身的字段吗?
  • 是的。我认为coffeeScript 让问题变得混乱,所以我更新了它的js 版本。

标签: node.js mongodb coffeescript meteor


【解决方案1】:

每当我对@ 变量感到陌生时,我都会在该闭包之外进行引用。所以从这里:

collection.update (_id: id),
  ($set:
    'tmp.$.data': do ->
      return @a + @b),
  (multi:true)

对此:

a = @a
b = @b 
collection.update( 
  _id: id
  $set:
    'tmp.$.data': do ->
      return a + b
  multi:true
)

当一个函数期望一个函数作为参数并得到其他东西时,似乎事情会变得很糟糕。我不确定tmp.$.data 散列中的do 是否真的有必要,但我对meteor 的了解不足以说是或否。

【讨论】:

  • 实际上 @ 关键字在咖啡脚本中表示 this 并且确实使该函数成为 IIFE 函数。
  • @jwjin 是的,我意识到这一点,但如果另一端的代码不期望 IIFE,它可能会搞砸。我已经看到它发生了,尤其是用粗箭头。
猜你喜欢
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
相关资源
最近更新 更多