आप जिस बुनियादी ऑपरेशन की तलाश कर रहे हैं वह है findOneAndDelete()
नेवला में जो एक परमाणु ऑपरेशन है जो प्रतिक्रिया के साथ "हटाए गए" दस्तावेज़ को लौटाता है। यह केवल एक ही दस्तावेज़ को प्रभावित करता है और आप विकल्पों में सॉर्ट विनिर्देश लागू करके "अंतिम" प्राप्त करते हैं।
आपके पास मूल रूप से "अंतिम" के लिए दो विकल्प होते हैं, या तो एक बीएसओएन "दिनांक" संपत्ति वाले फ़ील्ड से होने के कारण आपने दस्तावेज़ों में संग्रहीत किया है जिसे आप सॉर्ट कर सकते हैं:
Model.findOneAndDelete(
{ "field": "a" },
{ "sort": { "date": -1 } }
)
या _id
. का उपयोग करके फ़ील्ड जहाँ एक ObjectId
का उपयोग किया गया था, क्योंकि बिना किसी अन्य हस्तक्षेप के यह मान प्रत्येक सम्मिलित दस्तावेज़ के साथ "हमेशा बढ़ेगा":
Model.findOneAndDelete(
{ "field": "a" },
{ "sort": { "_id": -1 } }
)
यह आम तौर पर आपका विकल्प है यदि आपने "नवीनतम सम्मिलित" या "अंतिम संशोधित" निर्धारित करने के साधन के रूप में बीएसओएन तिथि के साथ दस्तावेज़ के भीतर कोई फ़ील्ड संग्रहीत नहीं किया है। यदि आप "आखिरी बार संशोधित" चाहते हैं तो आपके पास वास्तव में कोई अन्य विकल्प नहीं है कि दस्तावेज़ के भीतर ऐसी बीएसओएन तिथि संपत्ति रिकॉर्ड करने के लिए _id
के बाद से स्वयं अपरिवर्तनीय है और नहीं बदलता है, और "बनाई गई तिथि" के लिए सबसे अच्छा "फ़ॉलबैक" है जब आपने ऐसी जानकारी रिकॉर्ड करने के लिए किसी अन्य फ़ील्ड को स्पष्ट रूप से संग्रहीत नहीं किया था।
एक पूर्ण उदाहरण निम्नानुसार है, जो एक संग्रह में कई दस्तावेज़ जोड़ने और फिर आपूर्ति किए गए क्वेरी मानदंडों को पूरा करने वाले केवल "अंतिम" दस्तावेज़ को "हटा" देता है। दोनों एक संग्रहीत तिथि और _id
. का उपयोग कर रहे हैं क्षेत्र प्रदर्शित होते हैं:
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()
}
})()
और यह अपेक्षित आउटपुट देता है:
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
}
]
}