猫鼬切片不限制数组大小
Mongoose Slice Not Limiting Array Size
我正在开发一个应用程序,但我遇到了 Mongoose 在更新时限制数组大小的问题。我不太熟悉 MongoDB 或 Mongoose,但我希望这个项目能增长我的知识。我尝试了一些在 SOF 上查询的其他解决方案,但 none 似乎对我有用。这是我对问题的细分...
库:猫鼬 5.7.7
总结:在日志文档中,我希望只保留最新的10条日志,旧的被推离阵列。
问题:对于我当前的查询,切片似乎没有限制文档的数量。该阵列只是继续增长。
ActivityLog.updateOne(
{ guild },
{
$push: {
logs: {
$each: [{ ...log }]
},
$slice: -10
}
},
{ upsert: true }
);
这在您的实施中实际上可能是一个更大的问题。以下是实际使用中的基本内容,以证明它确实有效:
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
)你会看到:
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
长度的数组,并且由于负数而从数组的末尾开始,既将数组增长到设定的大小,然后删除除了最后添加的所有内容成员。
我正在开发一个应用程序,但我遇到了 Mongoose 在更新时限制数组大小的问题。我不太熟悉 MongoDB 或 Mongoose,但我希望这个项目能增长我的知识。我尝试了一些在 SOF 上查询的其他解决方案,但 none 似乎对我有用。这是我对问题的细分...
库:猫鼬 5.7.7
总结:在日志文档中,我希望只保留最新的10条日志,旧的被推离阵列。
问题:对于我当前的查询,切片似乎没有限制文档的数量。该阵列只是继续增长。
ActivityLog.updateOne(
{ guild },
{
$push: {
logs: {
$each: [{ ...log }]
},
$slice: -10
}
},
{ upsert: true }
);
这在您的实施中实际上可能是一个更大的问题。以下是实际使用中的基本内容,以证明它确实有效:
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
)你会看到:
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
长度的数组,并且由于负数而从数组的末尾开始,既将数组增长到设定的大小,然后删除除了最后添加的所有内容成员。