14

I want to query my MongoDB collection without any filter with MongoDB .NET Driver 2.0 but I didn't find a way. I have the following workaround but it looks weird :D

var filter = Builders<FooBar>.Filter.Exists(x => x.Id);
var fooBars = await _fooBarCollection.Find(filter)
    .Skip(0)
    .Limit(100)
    .ToListAsync();

Is there a way to issue queries without a filter in MongoDB .NET Driver 2.0?

i3arnon
  • 113,022
  • 33
  • 324
  • 344
tugberk
  • 57,477
  • 67
  • 243
  • 335
  • 2
    How about using an **empty** BSON document. That is the basic shell requirement. –  Jun 14 '15 at 12:22
  • Can you share a sample snippet? I don't know what you exactly mean :s – tugberk Jun 14 '15 at 12:23
  • Plenty of examples shuffling around. Have you even tried submitting your `.Find()` without a "filter"? That means **all** to most of us. Otherwise just: `new BsonDocument()` –  Jun 14 '15 at 12:26
  • "Have you even tried submitting your .Find() without a "filter"?" there is not an overload of Find which takes no params. – tugberk Jun 14 '15 at 12:29

4 Answers4

25

You can't use Find without a filter.

You can however use a filter that passes everything:

var findFluent = await _fooBarCollection.Find(_ => true);

Or you can use an empty document which is equivalent:

var findFluent = await _fooBarCollection.Find(new BsonDocument());

They have also added an empty filter but it will only be available in newer versions of the driver:

var findFluent = await _fooBarCollection.Find(Builders<FooBar>.Filter.Empty);
i3arnon
  • 113,022
  • 33
  • 324
  • 344
1

FindAll() is the part of MongoDB 1x series driver. to get the same functionality in 2x series driver use find() with empty BSON Document.

var list = await collection.Find(new BsonDocument()).ToListAsync();
foreach (var dox in list)
{
    Console.WriteLine(dox);
}

Reference

Pavlo Neiman
  • 7,438
  • 3
  • 28
  • 28
K Raghava Reddy
  • 147
  • 1
  • 3
1

To match all elements, you could use the FilterDefinitionBuilder.Empty property. I use this property when a user is given the option to query the entire collection, or filter by a single property.

If you're only looking to query the entire collection, without the possibility of a filter, then this isn't necessary.

var builder = Builders<Object>.Filter;
                 matchFilter;
                
FilterDefinition<Object> matchFilter = builder.Empty;
   
var results = await collection.Aggregate()
                              .Match(filter)
                              .ToListAsync()
Wassim Katbey
  • 298
  • 4
  • 9
0

It works for me

public class TestProductContext
{
    MongoClient _client;
    IMongoDatabase _db;

    public TestProductContext()
    {
        _client = new MongoClient("mongodb://localhost:27017");
        _db = _client.GetDatabase("EmployeeDB");

    }

    public IMongoCollection<Product> Products => _db.GetCollection<Product>("Products");
}

public class DataAccess
{
    private TestProductContext _testProductContext;

    public DataAccess(TestProductContext testProductContext)
    {
        _testProductContext = testProductContext;
    }
    public List<Product> GetProducts()
    {
        List<Product> pto = new List<Product>();
        var cursor = _testProductContext.Products.Find(new BsonDocument()).ToCursor();
        foreach (var document in cursor.ToEnumerable())
        {
            pto.Add(document);
        }
    }
}
Pavlo Neiman
  • 7,438
  • 3
  • 28
  • 28