可以先看下基本操作
1.添加
[HttpPost("embeddedDocument/add")]
public async Task embeddedDocumentAdd()
{
var emDocument1 = new EmbeddedDocument
{
Key = "key1",
Value = "value1",
EmbeddedEnumType = EmbeddedEnum.A,
};
emDocument1.Id = Yitter.IdGenerator.YitIdHelper.NextId();
var filter = Builders<Test>.Filter.Eq(a => a.Id, 200453425136140359);
var filter1 = Builders<Test>.Filter.Eq(a => a.Id, 200453425136140358);
var filter2 = Builders<Test>.Filter.Eq(a => a.Id, 200453425136140357);
var update = Builders<Test>.Update.AddToSet(x => x.embeddedDocuments, emDocument1);
await _testMongoRepository.UpdateAsync(filter, update);
await _testMongoRepository.UpdateAsync(filter1, update);
await _testMongoRepository.UpdateAsync(filter2, update);
}
结果.第一行,第二行都会添加成功,第三行会报错,,所以没有添加上去.
2.修改
原数据
/// <summary>
/// 修改
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("embeddedDocument/update")]
public async Task Update()
{
var input = new EmbeddedDocument
{ Id = 201347133553508422,
Key = "key1",
Value = "value2",
EmbeddedEnumType = EmbeddedEnum.B,
};
var filter = Builders<Test>.Filter.Eq(a => a.Id, 200453425136140359)
& Builders<Test>.Filter.ElemMatch(x => x.embeddedDocuments, y => y.Id ==input.Id );
var update = Builders<Test>.Update.Set("embeddedDocuments.$", input);
await _testMongoRepository.UpdateAsync(filter, update);
}
修改结果
3.删除
/// <summary>
/// 删除
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("embeddedDocument/delete")]
public async Task embeddedDocumentDelete()
{
var filter = Builders<Test>.Filter.Eq(a => a.Id, 200453126405226565);
var update = Builders<Test>.Update.PullFilter(x => x.embeddedDocuments, y => y.Id == 200453126405226567);
await _testMongoRepository.UpdateAsync(filter, update);
}
结果
4.查
先放下
二.内嵌文档的内嵌文档操作
数据准备
实体类修改了,
public class Test : BaseEntity
{
[BsonRepresentation(BsonType.Double)]
public decimal Num { get; set; }
public DateTime? TestTime { get; set; } = DateTime.Now;
public List<EmbeddedDocument> embeddedDocuments { get; set; }
public string Name { get; set; }
public List<EmDocument2> EmDocument2s { get; set; }
}
public class EmDocument2 : BaseEntity
{
public string StudentName { get; set; }
[BsonRepresentation(BsonType.Double)]
public decimal Price { get; set; }
public PriceEnum priceEnum { get; set; }
public List<EmbeddedDocument> embeddedDocumentList { get; set; }
}
public enum PriceEnum
{
[Description("英语")]
English = 1,
[Description("数学")]
Math,
[Description("语文")]
Chinese,
}
1.增
原数据
[HttpPost("/EmDocument2s/embeddedDocumentList/Add")]
public async Task embeddedDocumentListAdd()
{
var input = new EmbeddedDocument();
input.Id = Yitter.IdGenerator.YitIdHelper.NextId();
input.EmbeddedEnumType = EmbeddedEnum.B;
input.Value = "value3";
input.Key = "key3";
var filter = Builders<Test>.Filter.Eq(a => a.Id, 201356076902252613)
& Builders<Test>.Filter.ElemMatch(x => x.EmDocument2s, y => y.Id == 201356076904349768);
var update = Builders<Test>.Update.Push("EmDocument2s.$.embeddedDocumentList", input);
await _testMongoRepository.UpdateAsync(filter, update);
}
结果
2.修改
原数据
[HttpPost("/EmDocument2s/embeddedDocumentList/update")]
public async Task embeddedDocumentListUpdate()
{
var input = new EmbeddedDocument();
input.EmbeddedEnumType = EmbeddedEnum.A;
input.Value = "value4";
input.Key = "key4";
var filter = Builders<Test>.Filter.Eq(a => a.Id, 201356076902252613);
var update = Builders<Test>.Update.Set("EmDocument2s.$[g].embeddedDocumentList.$[gg]", input);
var arrayFilters = new List<ArrayFilterDefinition>
{
new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("g._id", 201356076904349768)),
new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("gg._id", 201358008255512646)),
};
var options = new UpdateOptions { ArrayFilters = arrayFilters };
await _testMongoRepository.Entities.UpdateOneAsync(filter, update, options);
}
结果
3.删除
[HttpPost("/EmDocument2s/embeddedDocumentList/delete")]
public async Task embeddedDocumentListDelete()
{
var filter = Builders<Test>.Filter.Eq(a => a.Id, 201356076902252613);
var update = Builders<Test>.Update.PullFilter("EmDocument2s.$[g].embeddedDocumentList", Builders<BsonDocument>.Filter.Eq("_id", 201359705711312965));
var arrayFilters = new List<ArrayFilterDefinition>
{
new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("g._id", 201356076904349768)),
};
var options = new UpdateOptions { ArrayFilters = arrayFilters };
await _testMongoRepository.Entities.UpdateOneAsync(filter, update, options);
}
4.查询
先放下.
三.第四层 ,还是有点区别的相对于第三层 ,再深的的话也跟这层一样的套路了,我就不创建实体类了,
1.增
public async Task Add()
{
var filter = Builders<Test>.Filter.Eq(ab => ab.Id, 第一层id)
& Builders<Test>.Filter.ElemMatch(x => x.EmDocument2s, y => y.Id == 第二层id);
var update = Builders<Test>.Update.Push("EmDocument2s.$.embeddedDocumentList.$[g].第四层的list", input);
var arrayFilters = new List<ArrayFilterDefinition>
{
new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("g._id", 第三层id)),
};
var options = new UpdateOptions { ArrayFilters = arrayFilters };
await _testMongoRepository.Entities.UpdateOneAsync(filter, update, options);
}
2.修改
public async Task Update()
{
var filter = Builders<Test>.Filter.Eq(a => a.Id, 第一层id);
var update = Builders<Test>.Update.Set("EmDocument2s.$[g].embeddedDocumentList.$[gg].第四层的list.$[ggg]", input);
var arrayFilters = new List<ArrayFilterDefinition>
{
new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("g._id", 第二层id)),
new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("gg._id", 第三层id)),
new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("ggg._id", 第四层id)),
};
var options = new UpdateOptions { ArrayFilters = arrayFilters };
await _testMongoRepository.Entities.UpdateOneAsync(filter, update, options);
}
3.删
public async Task Delete()
{
var filter = Builders<Test>.Filter.Eq(a => a.Id, 第一层id);
var update = Builders<Test>.Update.PullFilter("EmDocument2s.$[g].embeddedDocumentList.$[gg].第四层的list", Builders<BsonDocument>.Filter.Eq("_id", 第四层id));
var arrayFilters = new List<ArrayFilterDefinition>
{
new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("g._id", 第二层id)),
new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("gg._id", 第三层id)),
};
var options = new UpdateOptions { ArrayFilters = arrayFilters };
await _testMongoRepository.Entities.UpdateOneAsync(filter, update, options);
}
全部的代码,我就放进文件上传了.