Mongodb find's returning document order

后端 未结 1 1490
南旧
南旧 2020-12-20 01:29

I have a collection with an field named \"date\" (also indexed). It holds the values yyyymmdd (example: 20140731, 20140730, 20140729...)

The documents are stored in

相关标签:
1条回答
  • 2020-12-20 01:42

    Documents are stored in natural order

    The documents are stored in descending order based on date. So the collection has 20140731 as the first document.

    Unless you are using a capped collection, there is no guarantee for the ordering of documents on disk (also referred to as natural order).

    Document deletions and moves (when a document outgrows its allocated record space) create space on the free list which will be reused.

    Here's a quick example which should demonstrate this in the mongo shell:

    // Start with an empty database & collection
    use demodb; db.dropDatabase(); db.order.drop()
    
    // Add some test data
    for (i=0; i<1000; i++) {
        db.order.insert({'i': i})
    }
    
    // Looks like insertion order! (0..9)
    db.order.find({}).limit(10);
    
    // Pause 5s for effect :)
    sleep(5000);
    
    // Remove half the entries
    db.order.remove({ i: { $lt: 500 }})
    
    // Re-add the missing entries
    for (i=0; i<500; i++) {
        db.order.insert({'i': i})
    }
    
    // Not the entries you expected .. space from deleted records was reused
    db.order.find({}).limit(10)
    
    // Clean up demodb
    db.dropDatabase()
    

    Order of results

    When I use the find command with filters {$gte : 20140720, $lte : 20140731}, mongodb returns back the query in ascending order of "date" field.

    If an index is used for a query, the documents are returned in the order they are found in the index. You should take advantage of this when constructing your indexes for common queries (see: Use Indexes to Sort Query Results).

    FYI, a simple index (eg. on {date:1}) can be used to return the results sorted in either ascending or descending order.

    Sort by ObjectID

    If you are using MongoDB's default ObjectIDs for _id, you can sort by { _id: 1 } to approximate insertion order since the first 4 bytes of the ObjectID incorporate a timestamp. If you wanted to use this for sorting a query based on date and approximate insertion order you would ensure an index on {date:1, _id:1}.

    Note that ObjectIDs are typically generated by the client driver, so if you have clock drift on your app servers (or the _id is created some time before the document is inserted) the ObjectIDs may not strictly reflect "insertion order" as seen by the server. If accuracy of insertion order is highly important, it is generally possible to generate the _id on the server-side (approach varies depending on the driver).

    0 讨论(0)
提交回复
热议问题