小编tur*_*hal的帖子

MongooseError:操作“featureds.find()”缓冲在 10000 毫秒后超时

我在 MongoDB 上有一个集合,我尝试使用以下方法从中查询所有元素find()

const mongoose = require('mongoose');
const Featured = mongoose.model('featured');
module.exports = app => {
    app.get('/api/featured', async (req, res) => {
      console.log("featured route");
      const featured = await Featured.find();
      console.log(featured);
      res.send(featured);
    })
}

Run Code Online (Sandbox Code Playgroud)

这是Featured.js:

const mongoose = require('mongoose');
const { Schema } = mongoose;

const featuredSchema = new Schema({});

mongoose.model('featured', featuredSchema);
Run Code Online (Sandbox Code Playgroud)

但是,我在发出请求时收到错误:

(node:75568) UnhandledPromiseRejectionWarning: MongooseError: Operation `featureds.find()` buffering timed out after 10000ms
    at Timeout.<anonymous> (/Users/prikshetsharma/Desktop/humboiserver/node_modules/mongoose/lib/drivers/node-mongodb-native/collection.js:184:20)
    at listOnTimeout (internal/timers.js:554:17)
    at processTimers (internal/timers.js:497:7)
(node:75568) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error …
Run Code Online (Sandbox Code Playgroud)

javascript mongoose mongodb node.js

7
推荐指数
1
解决办法
2万
查看次数

使用 mongoDB 切换布尔值

我正在使用 mongoDB 数据库,我想切换 Day 对象内的布尔值present 属性。这是我的工作代码:

exports.modifyPresence = (req, res) => {
  action.getStudentCurrentDay(req.body.hash)
  .then(
    dayId => {
      return Day.findOne({_id: dayId});
    }
  )
  .then(
    day => {
      return Day.findOneAndUpdate({_id: day.id},{$set:{present:!day.present}});
    }
  )
  .then(
    () => res.status(200).json("This is a success")
  )
  .catch(
    (error) => res.status(500).json({error})
  )
}
Run Code Online (Sandbox Code Playgroud)

它正在工作,但我很想打电话给我的数据库一次并编写如下内容:

exports.modifyPresence = (req, res) => {
  action.getStudentCurrentDay(req.body.hash)
  .then(
    dayId => {
      return Day.findOneAndUpdate({_id: day.id},{$set:{present:!present}});
    }
  )
  .then(
    () => res.status(200).json("This is a success")
  )
  .catch(
    (error) => res.status(500).json({error})
  )
}
Run Code Online (Sandbox Code Playgroud)

有谁知道如何实现对数据库的单个调用并以优雅的方式切换我的布尔值?我不知道如何简化我的代码。

谢谢你们

optimization boolean toggle mongodb

6
推荐指数
2
解决办法
7010
查看次数

Mongo 查询以获取不同的嵌套文档

我需要获取不同的嵌套文档。

请找到示例文档:

{
    "propertyId": 1001820437,
    "date": ISODate("2020-07-17T00:00:00.000Z"),
    "HList":[
        {
            "productId": 123,
            "name": "Dubai",
            "tsh": true
        }
    ],
    "PList":[
        {
            "productId": 123,
            "name": "Dubai",
            "tsh": false
        },
        {
            "productId": 234,
            "name": "India",
            "tsh": true
        }
    ],
    "CList":[
        {
            "productId": 234,
            "name": "India",
            "tsh": false
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

预期结果是:

{
    "produts":[
        {
            "productId": 123,
            "name": "Dubai"
        },
        {
            "productId": 234,
            "name": "India"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我试过这个查询:

 db.property.aggregate([
    { 
        $match: { 
            "propertyId": 1001820437,
            "date": ISODate("2020-07-17T00:00:00.000Z")
        }
    },
    { 
        "$project": {
            "_id": 0,
            "unique": …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

6
推荐指数
2
解决办法
240
查看次数

一种使一个集合中的特定文档过期并在过期时将其添加到另一个集合的好方法

我正在使用 Nodejs 和 MongoDB 驱动程序。

一个由两部分组成的问题

  1. 我有一个名为的集合openOffers,我想在它到达时间时过期closeOfferAt。我知道 MongoDB 提供了 TTL,expireAt并且expireAfterSeconds. 但是,当我使用它们时,相同的 TTL 会应用于特定集合中的所有文档。我不确定我这样做是否正确。我想要文档级别的自定义到期时间。任何语法都可能非常有用!文档位于openOffers
{
 "_id":"12345",
 "data": {...},
 "closeOfferAt" : "2022-02-21T23:22:34.023Z"
}
Run Code Online (Sandbox Code Playgroud)
  1. 我想将这些过期的文档推送到另一个集合openOfferLog。这样我就可以保留该文档以供以后分析。

目前的方法:我还没有找到一种方法来为openOffers. 但是,我目前将文档插入到两者中,openOffers并且openOffersLog一起插入,并且任何数据更改都openOffers必须单独传播以openOffersLog确保一致性。我想必须有一种更好的可扩展方法。

编辑1:

我正在寻找一些可用于上述用例的语法逻辑。如果当前的 MongoDB 驱动程序无法实现,我正在寻找一个带有 NodeJS 代码的替代解决方案,我可以尝试一下。我对 NodeJS 和 MongoDB 都很陌生——所以任何支持该解决方案的推理也将非常有用。

mongodb mongodb-query aggregation-framework

6
推荐指数
1
解决办法
9743
查看次数

Mongo 聚合匹配多个值

我有以下文件

  {
       name: 'John',
       Address :'street 1 '
   },
   {
       name: 'Jane',
       Address :'street 2 '
   },
   {
       name: 'Smith',
       Address :'street 3 '
   }
Run Code Online (Sandbox Code Playgroud)

我想在 mongo 聚合管道中搜索具有不同值的多个文档。

这意味着name =('John','Smith')。我期待的结果是

{
   name: 'John',
   Address :'street 1 '
},
{
   name: 'Smith',
   Address :'street 3 '
}
Run Code Online (Sandbox Code Playgroud)

我的代码是

db.articles.aggregate($match: { $or: [{ name: 'John' }, { name: 'Smith' }]);
Run Code Online (Sandbox Code Playgroud)

这是一个空值。是否可以这样获取文档?

mongodb mongodb-query aggregation-framework

5
推荐指数
1
解决办法
6009
查看次数

所有字段上的 Concat 数组 MongoDB

想象一下我有这个集合:

{
  id: 1,
  b: { 
   "field1": ['foo'],
   "field2": ['bar']
  }
}
{
  id: 2,
  b: { 
   "field2": ["foobar"],
   "field3": ["foofoo"]
  }
}
Run Code Online (Sandbox Code Playgroud)

我想用 MongoDB 获取一个新集合:

{
 id: 1,
 b_grouped: ['foo', 'bar']
}
{
 id: 2,
 b_grouped: ["foobar", "foofoo"]
}
Run Code Online (Sandbox Code Playgroud)

我不知道文档中字段的所有名称,任何人都会知道如何执行这样的操作:

db.collection.aggregate(
   [
      { "$project": { "b_grouped": { $concatArrays: ["$b.*"] } } }
   ]
)
Run Code Online (Sandbox Code Playgroud)

mongodb aggregation-framework

5
推荐指数
1
解决办法
84
查看次数

MongoDB $lookup 和 $map 对象数组

我试图这样做几天,但找不到任何成功

我正在使用 MongoDB,我尝试使用许多管道步骤来完成它,但找不到方法。

我有一个玩家集合,每个玩家包含一个items数组

{
    "_id": ObjectId("5fba17c1c4566e57fafdcd7e"),
    "username": "moshe",
    "items": [
        {
            "_id": ObjectId("5fbb5ac178045a985690b5fd"),
            "equipped": false,
            "itemId": "5fbb5ab778045a985690b5fc"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我有一个项目集合,其中包含有关播放器items数组中每个项目的更多信息。

{
    "_id": ObjectId("5fbb5ab778045a985690b5fc"),
    "name": "Axe",
    "damage": 4,
    "defense": 6
}
Run Code Online (Sandbox Code Playgroud)

我的目标是拥有一个玩家文档,其中包含有关其items数组中项目的所有信息,因此它看起来像这样:

{
    "_id": ObjectId("5fba17c1c4566e57fafdcd7e"),
    "username": "moshe",
    "items": [
        {
            "_id": ObjectId("5fbb5ac178045a985690b5fd"),
            "equipped": false,
            "itemId": "5fbb5ab778045a985690b5fc",
            "name": "Axe",
            "damage": 4,
            "defense": 6
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

aggregation mongodb mongodb-query

5
推荐指数
2
解决办法
1527
查看次数

mongo $filter 和子子数组中的多个条件

我有这部分的收藏:

[{
  "_id": ObjectId("604f3ae3194f2135b0ade569"),
  "parameters": [
    {
      "_id": ObjectId("602b7455f4b4bf5b41662ec1"),
      "name": "Purpose",
      "options": [
        {
          "id": ObjectId("602b764ff4b4bf5b41662ec2"),
          "name": "debug",
          "sel": true
        },
        {
          "id": ObjectId("602b767df4b4bf5b41662ec3"),
          "name": "performance",
          "sel": false
        },
        {
          "id": ObjectId("602b764ff4b4bf5b41662ec4"),
          "name": "security",
          "sel": true
        },
        {
          "id": ObjectId("602b767df4b4bf5b41662ec5"),
          "name": "Not Applicable",
          "sel": false
        }
      ],
      "type": "multiple"
    }]
}]
Run Code Online (Sandbox Code Playgroud)

这个查询:

db.testCollection.aggregate([
    { $unwind: "$parameters" },
    {
        $match: {
            "parameters._id": ObjectId("602b7455f4b4bf5b41662ec1"),
        }
    },
    {
        $addFields: {
            match: {
                $filter: {
                    input: "$parameters.options",
                    as: "option",
                    cond: {
                        $and: [
                           { …
Run Code Online (Sandbox Code Playgroud)

mongodb mongodb-query aggregation-framework

5
推荐指数
1
解决办法
3168
查看次数

删除 MongoDB 集合中字符串字段值中的所有空格

我有一个名为“ users”的 mongodb 集合,有几千个用户。由于缺乏验证,用户能够创建username其中包含空格的“”。即,用户能够创建诸如“ I am the best”或“ I am the best”或“ I am the best ”等用户名。由于“用户名”字段在系统中没有以任何形式使用,所以到目前为止还可以。

从现在开始,客户端最终要使用“username”字段,即制作诸如“https://example.com/profile/{username}”之类的url。

问题是“用户名”字段值的开头、中间和结尾都有空格,如上所示,是随机的。所以我想使用查询删除它们。

我可以使用以下方式列出所有用户:

db.users.find({username:{ "$regex" : ".*[^\S].*" , "$options" : "i"}}).pretty();
Run Code Online (Sandbox Code Playgroud)

删除用户名字段中的所有空格并将其保存回来的最佳方法是什么?我不确定如何在单个查询中更新它们。

感谢帮助!

诗。我实际上需要编写一个代码块来替换这些用户名,同时检查“现有”用户名,以便不存在重复项,但如果我需要使用 mongodb 查询来执行此操作,我仍然想知道如何执行此操作。

regex collections replace mongodb mongodb-query

5
推荐指数
1
解决办法
4765
查看次数

$divide 累加器是一个一元运算符

我创建了一个对 Mongo DB 的请求:

{
    $project:
      {
        difference:
          {
            $subtract: ['$' + endDate, '$' + startDate]
          }
      }
  },
  {
    $match:
      {
        difference:
          {
            $gte: 0
          }
      }
  },
  {
    $group:
      {
        _id: null,
        avgTime:
          {
            $divide:
              [
                {
                  $avg: "$difference"
                }, 60000 // in minutes
              ]
          }
      }
  }
Run Code Online (Sandbox Code Playgroud)

我试着:

  1. difference计算结束日期和开始日期之间的差值,并在该差值> 0时取其值
  2. 计算平均值
  3. 除以 60000(得到分钟)

但我得到了错误:累加器$divide是一元运算符

我该如何解决这个请求?

mongoose mongodb mongodb-query aggregation-framework

4
推荐指数
1
解决办法
6155
查看次数