2013-09-28 68 views
25

Trong bộ sưu tập của tôi, tài liệu chứa khóa như trạng thái và dấu thời gian. Khi tôi muốn tìm mới nhất mười giấy tờ sau đó tôi viết sau đây truy vấnCách xóa số tài liệu N trong mongodb

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

Truy vấn này mang lại cho tôi kết quả mà tôi muốn nhưng khi tôi muốn xóa mới nhất mười giấy tờ sau đó tôi đang viết các truy vấn sau

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

nhưng nó hiển thị lỗi sau TypeError: Cannot call method 'sort' of undefined và một lần nữa tôi đã viết cùng một truy vấn như bên dưới db.collectionsname.remove({"status":0},10) Nó chỉ xóa một tài liệu. Vì vậy, làm thế nào tôi có thể viết một truy vấn mà xóa mười tài liệu mới nhất và các loại trên dấu thời gian?

+1

Điều đó có thể giúp bạn http://docs.mongodb.org/manual/reference/command/findAndModify/ – Mina

Trả lời

51

Bạn không thể đặt giới hạn khi sử dụng remove hoặc findAndModify. Vì vậy, nếu bạn muốn giới hạn chính xác số lượng tài liệu đã bị xóa, bạn sẽ cần thực hiện theo hai bước.

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

Sau đó vượt qua các trở _id s với phương pháp loại bỏ:

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

FYI: bạn không thể xóa tài liệu từ một bộ sưu tập mũ.

+0

Ai làm bạn phải làm phần sắp xếp nếu tất cả các hồ sơ sẽ bị xóa? – ULazdins

+2

Sửa lỗi nếu tôi sai, nhưng nó tạo sự khác biệt cho dù 'giới hạn (100)' xuất hiện trước 'sắp xếp ({timestamp: -1})' hay sau. Trong ví dụ @WiredPrairie giới hạn kết quả là 100 và sắp xếp chúng sau đó ('.sort ({timestamp: -1}). Limit (100)'). Trong trường hợp này, câu lệnh sắp xếp không có hiệu lực đối với các bản ghi được trả về. Mặt khác, nếu bạn viết '.limit (100) .sort ({timestamp: -1})', nó sẽ tạo sự khác biệt. – ULazdins

+10

@ULazdins "Mongo áp dụng sắp xếp trước khi giới hạn kết quả bất kể thứ tự bạn sắp xếp và giới hạn trên con trỏ." ([source] (http://stackoverflow.com/a/17509131/99777)) – joeytwiddle

-4

Dưới truy vấn sẽ tìm và xóa 10 tài liệu mới nhất từ ​​bộ sưu tập: -

db.collectionsname.findAndModify({ 
    query: { 'status':0 }, 
    sort: { 'timestamp': -1 }, 
    limit: 10, 
    remove: true 
}); 
+4

https://docs.mongodb.com/manual/reference/method/db.collection.findAndModify/ Điều này không 't hỗ trợ một "giới hạn" lĩnh vực, và trong thực tế, nếu bạn thử nó, bạn sẽ tìm thấy nó chỉ xóa 1 phần tử (vì đó là logic mặc định) – tweak2

Các vấn đề liên quan