我有这种方法将新数据推送到NozzleStateList:
public async Task AddNozzleState(NozzleState nozzleState, Guid tankId, Guid gasStationId)
{
UpdateDefinition<GasStation> update = Builders<GasStation>.Update.Push("TankList.$[t].NozzleList.$[n].NozzleStateList", nozzleState);
await _context.GetCollection<GasStation>().UpdateOneAsync(x => x.Id == gasStationId, update, new UpdateOptions
{
ArrayFilters = new List<ArrayFilterDefinition>{
new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("t._id", tankId)),
new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("n._id", nozzleState.NozzleId))
}
});
}
最后我改变了我的方法并使用了JsonArrayFilterDefinition,这段代码可以工作:
public async Task AddNozzleState(NozzleState nozzleState, Guid tankId, Guid gasStationId)
{
UpdateDefinition<GasStation> update = Builders<GasStation>.Update.Push("TankList.$[t].NozzleList.$[n].NozzleStateList", nozzleState);
await _context.GetCollection<GasStation>().UpdateOneAsync(x => x.Id == gasStationId, update, new UpdateOptions
{
ArrayFilters = new List<ArrayFilterDefinition>{
new JsonArrayFilterDefinition<Tank>("{'t._id': { $eq : UUID(\""+ tankId +"\")} }"),
new JsonArrayFilterDefinition<Nozzle>("{'n._id': { $eq : UUID(\""+ nozzleState.NozzleId+"\")}}")
}
});
}