【问题标题】:Query fields dynamically in MongoDB在 MongoDB 中动态查询字段
【发布时间】:2013-08-24 06:17:46
【问题描述】:

假设架构是:

var Rows = mongoose.model('Rows', {   
    row1: String,
    row2: String
});

如何随机查询其中一行?例如:

var rand = Math.floor(Math.rand() * 2);
Rows.find({ "row" + rand: "sup" }, function (err, result) {
    if (err) {
        console.log(err);
    }
    console.log(result);
});

此代码出错SyntaxError: Unexpected token +

【问题讨论】:

  • 错误是你不能以你尝试的方式使用快捷对象创建语法。您不能以这种方式即时构建属性/字段名称 - 它必须是文字字符串。
  • 而且,下面指出随机不会产生正确的结果。
  • 添加了包含这些详细信息的答案以及另一种可能更具表现力的方式,使用一些巧妙的 Mongoose 功能执行查询。

标签: javascript json node.js mongodb mongoose


【解决方案1】:

您不能通过使用快捷语法即时构建属性名称来创建 JavaScript 对象,它们必须是文字(字符串或数字):

var x = { "row1" : "sup" };

您可以这样做:

var x = {};
var rowNum = 1;
x["row" + 1] = "sup";

但是,表达查询的更简单的 Mongoose 方式是使用 where (docs):

var rand = Math.floor(Math.rand() * 2) + 1;
Rows.where("row" + rand, "sup").exec(function (err, result) {
    if (err) {
        console.log(err);
    }
    console.log(result);
});

【讨论】:

    【解决方案2】:

    试试看

    var rand = Math.floor(Math.rand() * 2);
    
    var objFind = {};
    objFind["row" + rand] = "sup";
    
    Rows.find(objFind, function (err, result) {
        if (err) {
            console.log(err);
        }
        console.log(result);
    });
    

    【讨论】:

      【解决方案3】:

      这不会给你预期的结果

      Math.floor(Math.random() * 2)
      

      要在 JavaScript 中获取随机数范围,您可能应该这样做:

      var randomWithRange = function (min, max) {
          return Math.random() * (max - min) + min;
      };
      

      在你的代码中使用它

      var conditions = {};
      conditions["row" + randomWithRange(1, 2)] = "sup";
      
      Rows.find(conditions, function(err, result){ ... });
      

      【讨论】:

      • 问题的重点不是问题的随机部分。我抛出了这段代码来抽象问题,使其对其他人也有用。
      • 对我向试图学习如何做某事的人提供额外信息感到羞耻。我想我不会浪费时间告诉你为什么row1row2rowN 也是一个糟糕的设计。
      • 朋友,不必苦恼。感谢您抽出宝贵时间回答! =)
      • @bzupnick 不管你问的重点是否是,作为原始 sn-p 的一个方面是容易出错的。它很有可能会查询到似乎不存在的row0
      猜你喜欢
      • 2016-10-22
      • 1970-01-01
      • 2015-03-12
      • 2018-03-10
      • 2017-02-20
      • 1970-01-01
      • 2018-08-19
      • 2018-11-25
      • 1970-01-01
      相关资源
      最近更新 更多