Thao tác cơ bản bạn đang tìm kiếm là findOneAndDelete()
trong mongoose là một hoạt động nguyên tử trả về tài liệu "đã loại bỏ" với phản hồi. Điều này chỉ ảnh hưởng đến một tài liệu duy nhất và bạn nhận được "tài liệu cuối cùng" bằng cách áp dụng đặc điểm kỹ thuật sắp xếp trong các tùy chọn.
Về cơ bản, sau đó bạn có hai tùy chọn cho "cuối cùng", hoặc là trường chứa thuộc tính "ngày" BSON mà bạn đã lưu trữ trong các tài liệu mà bạn có thể sắp xếp:
Model.findOneAndDelete(
{ "field": "a" },
{ "sort": { "date": -1 } }
)
Hoặc bằng cách sử dụng _id
trường có ObjectId
đã được sử dụng, như không có bất kỳ sự can thiệp nào khác, giá trị này sẽ "luôn tăng" với mọi tài liệu được chèn:
Model.findOneAndDelete(
{ "field": "a" },
{ "sort": { "_id": -1 } }
)
Nói chung, đó là tùy chọn của bạn nếu bạn không lưu trữ một trường trong tài liệu với Ngày BSON làm phương tiện xác định "được chèn mới nhất" hoặc "được sửa đổi lần cuối". Nếu bạn muốn "sửa đổi lần cuối" thì bạn thực sự không có tùy chọn nào khác để ghi lại thuộc tính ngày BSON như vậy trong tài liệu kể từ _id
bản thân nó là bất biến và không thay đổi, và tốt nhất là "dự phòng" cho "ngày tạo" khi bạn không lưu trữ rõ ràng bất kỳ trường nào khác để ghi lại thông tin đó.
Sau đây là một ví dụ đầy đủ, minh họa việc thêm nhiều tài liệu vào một bộ sưu tập và sau đó chỉ "xóa" tài liệu "cuối cùng" đáp ứng các tiêu chí truy vấn được cung cấp. Cả hai đều sử dụng ngày được lưu trữ và _id
trường được chứng minh:
const { Schema } = mongoose = require('mongoose');
const uri = 'mongodb://localhost/test';
mongoose.Promise = global.Promise;
mongoose.set('debug', true);
const testSchema = new Schema({
field: String,
other: String,
date: Date
});
const Test = mongoose.model('Test', testSchema);
const log = data => console.log(JSON.stringify(data, undefined, 2));
(async function() {
const now = Date.now();
const today = now - (now % (1000 * 60 * 60 * 24));
try {
const conn = await mongoose.connect(uri);
await Promise.all(Object.entries(conn.models).map(([k,m]) => m.remove()));
await Test.insertMany([
...[ ...Array(4)].map((e,i) =>
({
field: "a",
...(i === 3) ? { other: "last" }
: (i === 2) ? { other: "second last" } : {},
date: new Date(today + (i * 1000 * 60 * 60 * 24))
})
),
{ field: "b", date: new Date(today + (5 * 1000 * 60 * 60 * 24)) }
]);
let removed = await Test.findOneAndDelete(
{ field: "a" },
{ sort: { "date": -1 } }
);
log({ removed });
let remaining = await Test.find();
log({ remaining });
let next_removed = await Test.findOneAndDelete(
{ field: "a" },
{ sort: { "_id": -1 } }
);
log({ next_removed });
let still_remaining = await Test.find();
log({ still_remaining });
mongoose.disconnect();
} catch(e) {
console.error(e)
} finally {
process.exit()
}
})()
Và điều này trả về kết quả mong đợi là:
Mongoose: tests.remove({}, {})
Mongoose: tests.insertMany([ { _id: 5b0cb4a60cf8000c7ebd4402, field: 'a', date: 2018-05-29T00:00:00.000Z, __v: 0 }, { _id: 5b0cb4a60cf8000c7ebd4403, field: 'a', date: 2018-05-30T00:00:00.000Z, __v: 0 }, { _id: 5b0cb4a60cf8000c7ebd4404, field: 'a', other: 'second last', date: 2018-05-31T00:00:00.000Z, __v: 0 }, { _id: 5b0cb4a60cf8000c7ebd4405, field: 'a', other: 'last', date: 2018-06-01T00:00:00.000Z, __v: 0 }, { _id: 5b0cb4a60cf8000c7ebd4406, field: 'b', date: 2018-06-03T00:00:00.000Z, __v: 0 } ], {})
Mongoose: tests.findOneAndDelete({ field: 'a' }, { sort: { date: -1 } })
{
"removed": {
"_id": "5b0cb4a60cf8000c7ebd4405",
"field": "a",
"other": "last",
"date": "2018-06-01T00:00:00.000Z",
"__v": 0
}
}
Mongoose: tests.find({}, { fields: {} })
{
"remaining": [
{
"_id": "5b0cb4a60cf8000c7ebd4402",
"field": "a",
"date": "2018-05-29T00:00:00.000Z",
"__v": 0
},
{
"_id": "5b0cb4a60cf8000c7ebd4403",
"field": "a",
"date": "2018-05-30T00:00:00.000Z",
"__v": 0
},
{
"_id": "5b0cb4a60cf8000c7ebd4404",
"field": "a",
"other": "second last",
"date": "2018-05-31T00:00:00.000Z",
"__v": 0
},
{
"_id": "5b0cb4a60cf8000c7ebd4406",
"field": "b",
"date": "2018-06-03T00:00:00.000Z",
"__v": 0
}
]
}
Mongoose: tests.findOneAndDelete({ field: 'a' }, { sort: { _id: -1 } })
{
"next_removed": {
"_id": "5b0cb4a60cf8000c7ebd4404",
"field": "a",
"other": "second last",
"date": "2018-05-31T00:00:00.000Z",
"__v": 0
}
}
Mongoose: tests.find({}, { fields: {} })
{
"still_remaining": [
{
"_id": "5b0cb4a60cf8000c7ebd4402",
"field": "a",
"date": "2018-05-29T00:00:00.000Z",
"__v": 0
},
{
"_id": "5b0cb4a60cf8000c7ebd4403",
"field": "a",
"date": "2018-05-30T00:00:00.000Z",
"__v": 0
},
{
"_id": "5b0cb4a60cf8000c7ebd4406",
"field": "b",
"date": "2018-06-03T00:00:00.000Z",
"__v": 0
}
]
}