MongoDB - C# find

모든 도큐먼트 가져오기

  • 클래스 맵핑
var collection = GetDBCollection<DBBasic>("Basic");
var documents = await collection.Find(_ => true).ToListAsync();
return documents;
  • BsonDocument
    var collection = GetDBCollection<BsonDocument>("Basic");
    var documents = await collection.Find(new BsonDocument()).ToListAsync();
    return documents;
    

검색 시 첫 번째 도큐먼트만 가져온다

  • 클래스 맵핑 사용
var collection = GetDBCollection<DBBasic>("Basic");

// 기본으로는 Find 라는 메소드는 없다. Find는 확장 메소드로 사용하고 싶다면
//using MongoDB.Driver.Core.Misc;
//using MongoDB.Driver;
//을 선언해야 한다.

// 첫 번째 값 또는 없으면 null을 반환한다.
var document = await collection.Find(x => x._id == userID).FirstOrDefaultAsync();

조건에 맞는 모든 도큐먼트를 가져온다

var collection = GetDBCollection<DBBasic>("Basic");
var documents = await collection.Find(x=> x.Level >= level).ToListAsync();
return documents;

BsonDocument를 사용하여 검색

  • 도큐먼트의 필드를 수동으로 지정해야 한다.
var collection = GetDBCollection<BsonDocument>("Basic");

// useID와 동일한 도큐먼트들 검색.
var filter = new BsonDocument("_id", userID);
var documents = await collection.Find(filter).ToListAsync();

if (documents.Count > 0)
{
   return documents[0]["Level"].AsInt32; // 도큐먼트에 저장된 타입과 다르면 예외 발생
}

return 0;
var collection = GetDBCollection<DBBasic>("Basic");
// Level이 2 이상인 도큐먼트를 검색
var filter = new BsonDocument("Level", new BsonDocument("$gte", 2));
var documents = await collection.Find(filter).ToListAsync();
return documents;
  • 복수의 조건으로 검색한다
// Builders를 사용할 때는 Collection은 BsonDocument를 사용해야 한다.

var collection = GetDBCollection<BsonDocument>("Basic");

var builder = Builders<BsonDocument>.Filter;
var filter = builder.Gte("Level", 2) & builder.Eq("Money", 1000);
var documents = await collection.Find(filter).ToListAsync();

var IDList = new List<string>();

foreach (var document in documents)
{
   IDList.Add(document["_id"].AsString);
}
return IDList;

특정 필드의 데이터만 가져오기

  • 도큐먼트의 모든 필드의 데이터가 아닌 일부 필드의 값만 가져온다.
var collection = GetDBCollection<BsonDocument>("Basic");

// Level만
var documents = await collection.Find(new BsonDocument()).Project(BsonDocument.Parse("{Level:1}")).ToListAsync();

// Level, Money만
//var documents = await collection.Find(new BsonDocument()).Project(BsonDocument.Parse("{Level:1, Money:1}")).ToListAsync();
var collection = GetDBCollection<DBBasic>("Basic");
var projection = Builders<DBBasic>.Projection.Include("Exp").Include("Level");
var documents = await collection.Find(x => true).Project(projection).ToListAsync();

도큐먼트의 특정 필드를 제외한 데이터만 가져오기

var collection = GetDBCollection<BsonDocument>("Basic");

// Level만 제외한다
var documents = await collection.Find(new BsonDocument()).Project(BsonDocument.Parse("{Level:0}")).ToListAsync();

Expression. 지정된 필드만, 필드를 다른 이름으로

var collection = GetDBCollection<DBBasic>("Basic");
var projection = Builders<DBBasic>.Projection.Expression(x => new { X = x.Level, Y = x.Exp });
var documents = await collection.Find(x => true).Project(projection).ToListAsync();

//var projection = Builders<Widget>.Projection.Expression(x => new { X = x.X, Y = x.Y });
//var projection = Builders<Widget>.Projection.Expression(x => new { Sum = x.X + x.Y });
//var projection = Builders<Widget>.Projection.Expression(x => new { Avg = (x.X + x.Y) / 2 });
//var projection = Builders<Widget>.Projection.Expression(x => (x.X + x.Y) / 2);
// sort + projection + skip + limt
//var userID = "jacking";
//int userLevel = 0;

var projection = BsonDocument.Parse("{Level:1, Momey:1, Exp:1}");
var sort = BsonDocument.Parse("{Level:1}");
var options = new FindOptions
{
    AllowPartialResults = true,
    BatchSize = 20,
    Comment = "funny",
    //CursorType = CursorType.TailableAwait,
    MaxTime = TimeSpan.FromSeconds(3),
    NoCursorTimeout = true
};

var collection = GetDBCollection<DBBasic>("Basic");
var documents = collection.Find(x => x.Exp >= 0, options).Project(projection)
                                	.Sort(sort)
                                	.Limit(30)
                                	.Skip(0).ToListAsync();

Builders 사용

var collection = GetDBCollection<DBBasic>("Basic");

var builder = Builders<DBBasic>.Filter;
var filter = builder.Eq(x => x._id, "jacking") & builder.Lt(x => x.Money, 1100);
// or
//var filter = builder.Eq("X", 10) & builder.Lt("Y", 20);
// or
//var filter = builder.Eq("x", 10) & builder.Lt("y", 20);
// or
//var filter = Builders<DBBasic>.Filter.Where(x => x._id == "jacking" && x.Money < 1100);

// 첫 번째 값 또는 null
var document = await collection.Find(filter).FirstOrDefaultAsync();

배열 요소 조건 검색

  • 도큐먼트의 필드 중 배열이 있으 때 배열 요소 조건 검사.
var collection = GetDBCollection<DBBasic>("Basic");

// Costume 리스트의 요소 중 0 보다 크거나 같은 것이 있는 도큐먼트 검색
var filter = Builders<DBBasic>.Filter.AnyGt(x => x.Costume, 0);
var documents = await collection.Find(filter).ToListAsync();

// 비동기로 검색 후 데이터를 비동기로 바로 사용
var filter = new BsonDocument("x", new BsonDocument("$gte", 100));
await collection.Find(filter).ForEachAsync(async document =>
{
	await ProcessDocumentAsync(document);
});

데이터 정의

  • 객체 맵핑은 class만 가능하다
public class DBBasic
{
    public string _id; // 유저ID
    public int Level;
    public int Exp;
    public Int64 Money;
    public List<int> Costume; // 캐릭터 복장 아이템ID. 개수는 무조건 12
}

이 글은 2019-04-26에 작성되었습니다.