Mongoid random document

前端 未结 9 1407
迷失自我
迷失自我 2021-02-06 00:49

Lets say I have a Collection of users. Is there a way of using mongoid to find n random users in the collection where it does not return the same user twice? For now lets say

9条回答
  •  忘了有多久
    2021-02-06 01:25

    MongoDB 3.2 comes to the rescue with $sample (link to doc)

    EDIT : The most recent of Mongoid has implemented $sample, so you can call YourCollection.all.sample(5)

    Previous versions of mongoid

    Mongoid doesn't support sample until Mongoid 6, so you have to run this aggregate query with the Mongo driver :

    samples = User.collection.aggregate([ { '$sample': { size: 3 } } ])
    # call samples.to_a if you want to get the objects in memory
    

    What you can do with that

    I believe the functionnality should make its way soon to Mongoid, but in the meantime

    module Utility
      module_function
      def sample(model, count)
        ids = model.collection.aggregate([ 
          { '$sample': { size: count } }, # Sample from the collection
          { '$project': { _id: 1} }       # Keep only ID fields
        ]).to_a.map(&:values).flatten     # Some Ruby magic
    
        model.find(ids)
      end
    end
    
    Utility.sample(User, 50)
    

提交回复
热议问题