sql >> データベース >  >> NoSQL >> MongoDB

単一のクエリでMongoDBから最新のドキュメントを削除する

    探している基本的な操作は、 findOneAndDelete()です。 「削除された」ドキュメントを応答とともに返すアトミック操作であるマングース。これは単一のドキュメントにのみ影響し、オプションで並べ替え指定を適用することで「最後」を取得します。

    基本的に、「最後」には2つのオプションがあります。どちらかは、並べ替えることができるドキュメントに保存したBSON「日付」プロパティを含むフィールドによるものです。

    Model.findOneAndDelete(
       { "field": "a" },
       { "sort": { "date": -1 } }
    )
    

    または、_idを使用します ObjectIdが存在するフィールド 他の介入がなければ、この値は挿入されたすべてのドキュメントで「常に増加」するため、が使用されました。

    Model.findOneAndDelete(
       { "field": "a" },
       { "sort": { "_id": -1 } }
    )
    

    「最後に挿入された」または「最後に変更された」を判別する手段として、BSON日付を使用してドキュメント内にフィールドを格納しなかった場合は、通常、これがオプションです。 「最終変更」が必要な場合は、_id以降、ドキュメント内にそのようなBSON日付プロパティを記録する他のオプションはありません。 それ自体は不変であり、変更されません。そのような情報を記録するために他のフィールドを明示的に保存しなかった場合、せいぜい「作成日」の「フォールバック」になります。

    完全な例を次に示します。これは、コレクションに複数のドキュメントを追加してから、指定されたクエリ条件を満たす「最後の」ドキュメントのみを「削除」する方法を示しています。保存された日付と_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
        }
      ]
    }
    


    1. インデックスを使用していないクエリやmongodbで遅いクエリを見つける方法

    2. マングースと約束:クエリ結果の配列を取得する方法は?

    3. MongoDB C#ドライバー:挿入時にプロパティを無視する

    4. サブドキュメントのマングースの人口配列