【问题标题】:node-mongodb findOne behaviornode-mongodb findOne 行为
【发布时间】:2012-04-06 19:20:44
【问题描述】:

我有一个奇怪的问题,我似乎无法解释。鉴于以下情况:

Generics.prototype.getCollection= function(collection,callback) {
  this.db.collection(collection, function(error, document_collection) {
    if( error ) callback(error);
    else callback(null, document_collection);
  });
};

Generics.prototype.findById = function(collection, id, callback) {
    this.getCollection(collection,function(error, document_collection) {
      if( error ) callback(error)
      else {
        document_collection.findOne({_id: document_collection.db.bson_serializer.ObjectID.createFromHexString(id)}, function(error, result) {
          if( error ) callback(error)
          else callback(null, result)
        });
      }
    });
};

Generics.prototype.findOne = function(collection, _key, _value, callback) {
    this.getCollection(collection,function(error, document_collection) {
      if( error ) callback(error)
      else {
        document_collection.findOne({_key:_value}, function(error, result) {
          if( error ) callback(error)
          else callback(null, result)
        });
      }
    });
};

findById 就像一个魅力。但是,findOne 在执行时总是返回 null。我启动了 node-debugger 以找出交易是什么,我发现其中一个传递的变量正在以某种方式被破坏/擦除。 _key 似乎总是被删除。 _value 然而总是存在的。我尝试将 _key 重命名为其他名称,无论如何,它总是被删除。任何关于可能发生的事情的想法将不胜感激。谢谢!

更新 我只是进行了一些重构,以允许更灵活的搜索查询,并使其与一个变量一起工作。我还是想知道发生了什么。我觉得这是一些我不太了解的关闭业务。

Generics.prototype.findOne = function(collection, searchKeys, callback) {
    this.getCollection(collection,function(error, document_collection) {
      if( error ) callback(error)
      else {
        document_collection.findOne(searchKeys, function(error, result) {
          if( error ) callback(error)
          else callback(null, result)
        });
      }
    });
};

【问题讨论】:

    标签: javascript node.js mongodb


    【解决方案1】:

    如果您像将对象的键传递给 findOne 方法时那样使用 {} 语法,Javascript 将始终将对象的键视为字符串:

    {_key:_value}
    

    也就是说,上面的对象基本上是这样处理的:

    { '_key': _value }
    

    我认为这不是你想要的。克服这个问题的一种常见方法是创建一个对象并像这样使用 [] 运算符:

    var temp = {};
    temp[_key] = _value; // here, the _temp symbol is interpreted as a js variable
    

    【讨论】:

    • 这实际上不是我想要做的,我真的想要哈希值。将键名括在引号中是 python 的一种习惯 :) 问题是为什么“_key”变量被破坏而“_value”变量幸存下来。我无法通过代码追踪找出原因。
    • 对不起,我不太听从你的说法。你想要哈希是什么意思?你习惯用引号括起来是什么意思(因为我在你的代码中没有看到它们)?为了澄清我的答案, var someKey = 'abcd'; var o = { someKey: 'z' };会给你一个 o 是 { 'someKey': 'z' } 而不是 { 'abcd': 'z' }。
    猜你喜欢
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多