【问题标题】:MongoDB Query with multiple conditions and slice具有多个条件和切片的 MongoDB 查询
【发布时间】:2017-06-30 13:18:01
【问题描述】:

我有这个 Mongoose 查询:

 return Domain.find({domain:req.params.domain})
 .where('date').equals(date)
 .exec(function (err, domain) {
    if (!err) {
      if (!isEmpty(domain[0].visitors)) {
        domain[0]['visitors'] = domain[0].visitors.slice(0,99);
      }
  }

我想直接在数据库中切片,而不是在检索对象之后。 Mongoose 不能这样做,或者它没有记录,或者我没有找到文档。

所以我通过使用 collection 关键字回退到 node.js 原生 MongoDB 驱动程序。

我的代码现在如下所示并且失败了:

return Domain.collection.find(

  { "domain":req.params.domain }, 
  { "date":date }, 
  { "visitors": { $slice:100 } }, 
    function(err,domain){
      if (!err) {
         res.status(200).send({
           domain:domain
         });
      }

完整代码https://gist.github.com/nottinhill/b3837d4c913b9e5dd879

我尝试在 MongoDB 控制台中构建一个可以工作的查询,但无法让这个简单的查询工作。 MongoDB 文档没有显示如何使用两个条件进行查询。我想:

我想要的

伪代码

find
   giveBack wholeDomainObject
   where domain == domain
   where date == date
   also slice visitorsArray

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    投影是一个单一的对象定义。此外,您“查询”事物,而不是在投影中要求匹配条件,而不是特定字段匹配标准。 $slice 是一种特殊情况,默认不排除投影中的其他字段:

    Domain.collection.find(
      { "domain":req.params.domain, "date": date }, 
      { "visitors": { "$slice":100 } }, 
      function(err,domain){
         // process results here
      }
    );
    

    可能还要注意,这里的 $slice(就像 JavaScript 一样)是定义的“条目数”,而不是数组索引中的 n-1 引用。

    【讨论】:

    • 感谢您的解释。现在不幸的是,我看到了“TypeErr:将 ciruclar 结构转换为 JSON”。请注意:回调中有一个 res.status(200).send({domain:domain});
    • @SirBenBenji 我不知道在这个问题的上下文中这意味着什么。尽管您的问题完全是关于在返回的文档中的数组上制作“切片”,但您的代码表明您甚至根本不想返回该属性,但这似乎有点“奇怪”。也许您需要在另一个问题中提出这个问题,以便让所有可能回答的人更清楚您的观点。
    猜你喜欢
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多