首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >猫鼬片不限制阵列大小

猫鼬片不限制阵列大小
EN

Stack Overflow用户
提问于 2019-10-30 03:02:59
回答 1查看 422关注 0票数 1

我正在处理一个应用程序,并且在更新时遇到了猫鼬限制数组大小的问题。我不太熟悉MongoDB或猫鼬,但我希望这个项目能增加我的知识。我尝试了一些其他的解决方案,我对SOF提出了质疑,但似乎没有一个对我有用。这是我的问题分解..。

图书馆:猫鼬5.7.7

汇总:在日志文档中,我希望只保留10条最新日志,将旧日志从数组中推开。

问题:使用当前的查询,切片似乎没有限制文档的数量。数组在继续增长。

代码语言:javascript
复制
ActivityLog.updateOne(
  { guild },
  {
    $push: {
      logs: {
        $each: [{ ...log }]
      },
      $slice: -10
    }
  },
  { upsert: true }
);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-30 10:32:33

在您的实现中,这可能是一个更大的问题。下面是实际使用中的基本内容,以证明它确实有效:

代码语言:javascript
复制
const { Schema } = mongoose = require('mongoose');

const uri = 'mongodb://localhost:27017/test';
const options = { useNewUrlParser: true, useUnifiedTopology: true };

mongoose.set("debug", true);
mongoose.set("useFindAndModify", false);
mongoose.set("useCreateIndex", true);

const demoSchema = new Schema({
  _id: Number,
  fifo: [Number]
},{ _id: false });

const Demo = mongoose.model('Demo', demoSchema, 'demo');

const log = data => console.log(JSON.stringify(data, undefined, 2));

(async function() {

  try {

    const conn = await mongoose.connect(uri, options);

    await Promise.all(
      Object.values(conn.models).map(m => m.deleteMany())
    );

    let counter = 0;

    await new Promise((resolve, reject) =>
      setInterval(async () => {
        try {
          let result = await Demo.findByIdAndUpdate(
            1,
            { "$push": { "fifo": { "$each": [counter], "$slice": -3 } } },
            { upsert: true, new: true }
          );

          log(result);
        } catch(e) {
          reject(e)
        }
        counter++;
      }, 2000)
    );


  } catch (e) {
    console.error(e);
  } finally {
    mongoose.disconnect();
  }

})()

在几次迭代中(在这里使用-3进行简洁),您将看到:

代码语言:javascript
复制
Mongoose: demo.deleteMany({}, {})
Mongoose: demo.findOneAndUpdate({ _id: 1 }, { '$setOnInsert': { __v: 0 }, '$push': { fifo: { '$each': [ 0 ], '$slice': -3 } }}, { upsert: true, remove: false, projection: {}, returnOriginal: false })
{
  "fifo": [
    0
  ],
  "_id": 1,
  "__v": 0
}
Mongoose: demo.findOneAndUpdate({ _id: 1 }, { '$setOnInsert': { __v: 0 }, '$push': { fifo: { '$each': [ 1 ], '$slice': -3 } }}, { upsert: true, remove: false, projection: {}, returnOriginal: false })
{
  "fifo": [
    0,
    1
  ],
  "_id": 1,
  "__v": 0
}
Mongoose: demo.findOneAndUpdate({ _id: 1 }, { '$setOnInsert': { __v: 0 }, '$push': { fifo: { '$each': [ 2 ], '$slice': -3 } }}, { upsert: true, remove: false, projection: {}, returnOriginal: false })
{
  "fifo": [
    0,
    1,
    2
  ],
  "_id": 1,
  "__v": 0
}
Mongoose: demo.findOneAndUpdate({ _id: 1 }, { '$setOnInsert': { __v: 0 }, '$push': { fifo: { '$each': [ 3 ], '$slice': -3 } }}, { upsert: true, remove: false, projection: {}, returnOriginal: false })
{
  "fifo": [
    1,
    2,
    3
  ],
  "_id": 1,
  "__v": 0
}
Mongoose: demo.findOneAndUpdate({ _id: 1 }, { '$setOnInsert': { __v: 0 }, '$push': { fifo: { '$each': [ 4 ], '$slice': -3 } }}, { upsert: true, remove: false, projection: {}, returnOriginal: false })
{
  "fifo": [
    2,
    3,
    4
  ],
  "_id": 1,
  "__v": 0
}
Mongoose: demo.findOneAndUpdate({ _id: 1 }, { '$setOnInsert': { __v: 0 }, '$push': { fifo: { '$each': [ 5 ], '$slice': -3 } }}, { upsert: true, remove: false, projection: {}, returnOriginal: false })
{
  "fifo": [
    3,
    4,
    5
  ],
  "_id": 1,
  "__v": 0
}
Mongoose: demo.findOneAndUpdate({ _id: 1 }, { '$setOnInsert': { __v: 0 }, '$push': { fifo: { '$each': [ 6 ], '$slice': -3 } }}, { upsert: true, remove: false, projection: {}, returnOriginal: false })
{
  "fifo": [
    4,
    5,
    6
  ],
  "_id": 1,
  "__v": 0
}

因此,这确实保持了一个指定$slice长度的数组,并且由于负的原因,从数组的末尾开始,将数组扩展到设置的大小,然后删除除最后添加的所有成员之外的所有成员。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58618169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档