【问题标题】:Call function in document insert在文档插入中调用函数
【发布时间】:2014-09-20 21:14:03
【问题描述】:

我正在尝试根据autoincrement tutorial 创建“服务器端函数”(在 Mongo db 中加载的自定义 JS 函数)。 主要思想是有函数 getNextSequence(collectionName),它返回这个集合的自动增量 id。诀窍是为每个集合设置带有文档的单独集合“计数器”,保持自动增量状态。

无论如何,我已经在 Mongo 中创建并加载了该函数,它通过 Mongo shell 运行良好:

db.users.insert(
   {
     _id: getNextSequence("userid"),
     name: "Sarah C."
   }
)

它也可以通过 eval 在 NodeJS 中工作:

db.eval('getNextSequence(\'test\')', function(err, result){...});

但我不知道如何在从 NodeJS 插入时在文档中内联使用它。 我不能写:

   {
     _id: getNextSequence("userid"),
     name: "Sarah C."
   }

因为这会期望 getNextSequence 是 NodeJs 方法。 NodeJS + MongoDB中是否有任何表达形式? 谢谢!

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    您需要按照上面指定的方式在节点中调用它,然后使用插入时返回的值。

    db.eval('getNextSequence(\'test\')', function(err, result) {
      db.users.insert({
          _id: result,
          name: "John Doe"
          ...
        }, function(err, result) {
             ...
        }})
    });
    

    为了更简洁的语法,您可以尝试使用 npm 包 mongo-triggers:

    https://www.npmjs.org/package/mongo-triggers

    【讨论】:

    • 我希望我可以省去这个 db 调用,但我猜它是 driver-db 引擎的东西,没有比这更好的了。谢谢。
    • @ooouuiii - 我认为唯一的另一种选择是使用类似这样的方式滚动您自己的触发器:danielweberonline.wordpress.com/2012/05/14/…
    • 哇,我不知道这个:),谢谢。现在我只是为了清晰而牺牲了这个调用,但这对于未来的一些用例可能会很方便。我会看看,如果它通过了性能测试。也许另一种方法是将整个插入物放置到 eval 中。在这种情况下,在那里包含函数调用没有问题。但是对于一些nosql注入来说,它会很痛苦。
    • eval() 已弃用
    • @LHCHIN - 随时提供正确的解决方案/编辑答案。这个答案已经接近 7 年了,所以祈祷,无疑有更好的方法来做到这一点。
    【解决方案2】:

    在 post 方法中设置一个需要 db 的变量:
    var db = req.db;
    然后为您的数据库集合声明一个变量:
    var collection = db.get('counter');
    然后插入您的项目:

     collection.insert({
            _id: getNextSequence("userid"),
             名称:“莎拉 C.”
             },函数(错误,文档){
                 如果(错误){
                   // 做一点事
                 }
                 别的 {
                   // 做一点事
                 }
          });

    【讨论】:

    • 感谢提示,我可能解释得不好。这样我们就没有解决问题,NodeJS 会尝试调用函数 getNextSequence,它是在 mongoDb 中定义的,而不是在 NodejJs 中。
    猜你喜欢
    • 2020-04-23
    • 1970-01-01
    • 2018-03-05
    • 2014-11-04
    • 2018-03-05
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 2015-09-26
    相关资源
    最近更新 更多