65

私のコレクションでは、ドキュメントにはステータスやタイムスタンプなどのキーが含まれています。最新の 10 個のドキュメントを見つけたい場合は、次のクエリを記述します

db.collectionsname.find().sort({"timestamp"-1}).limit(10)

このクエリでは、必要な結果が得られますが、最新の 10 個のドキュメントを削除したい場合は、次のクエリを作成していました。

db.collectionsname.remove({"status":0},10).sort({"timestamp":-1})

しかし、次のエラーが表示 TypeError: Cannot call method 'sort' of undefined され、以下と同じクエリを書きました db.collectionsname.remove({"status":0},10) 。1つのドキュメントのみを削除します。では、最新の 10 個のドキュメントを削除し、タイムスタンプで並べ替えるクエリを作成するにはどうすればよいでしょうか?

4

10 に答える 10

92

removeまたはを使用する場合、制限を設定することはできませんfindAndModify。そのため、削除するドキュメントの数を正確に制限したい場合は、2 つの手順で行う必要があります。

db.collectionName.find({}, {_id : 1})
    .limit(100)
    .sort({timestamp:-1})
    .toArray()
    .map(function(doc) { return doc._id; });  // Pull out just the _ids

次に、返さ_idれた s を remove メソッドに渡します。

db.collectionName.remove({_id: {$in: removeIdsArray}})

参考までに: キャップされたコレクションからドキュメントを削除することはできません。

于 2013-09-28T11:15:21.153 に答える
1

実用的な解決策(上記の回答に触発された):

(大量のレコードを削除する場合は$inオペレーターに制限があるため、これが究極の解決策です) 1,000,000 件のレコードを削除する例

var ITERATIONS=1000;
var LIMIT=1000;
for(i=0; i<ITERATIONS; i++) {
    arr = db.MyCollection.find({}, {_id : 1}).limit(LIMIT).toArray().map(function(doc) { return doc._id; });
    db.MyCollection.remove({_id: {$in: arr}});
    // sleep(1);  // Optional for not loading mongo in case of huge amount of deletions
}

これはmongoシェルまたはRobomongo 3Tで実行できます

于 2020-08-04T09:32:36.980 に答える
-7

以下のクエリは、コレクションから最新の 10 個のドキュメントを検索して削除します。

db.collectionsname.findAndModify({
    query: { 'status':0 },
    sort: { 'timestamp': -1 },
    limit: 10,
    remove: true
});
于 2017-04-12T05:31:07.027 に答える