我正在使用这里讨论的自动增量 fild 。
我可以在 Mongo 控制台中执行这个例子,但是我如何使用 c# 驱动程序实现这样的事情?
db.products.insert({
"_id":getNextSequenceValue("productid"),
"product_name":"Apple iPhone",
"category":"mobiles"
})
Run Code Online (Sandbox Code Playgroud)
是否可以在写操作中指定一个函数?
我可以使用 Eval 调用这个函数,但由于它已被弃用,我想找到一个不使用它的解决方案。
我有以下方法来更新 MongoDB 中的文档:
public async Task UpdateAsync(T entity)
{
await _collection.ReplaceOneAsync(filter => filter.Id == entity.Id, entity);
}
Run Code Online (Sandbox Code Playgroud)
哪个工作正常 - 我只是想知道是否有人有这个UpdateManyAsync函数如何工作的例子:
public async Task UpdateManyAsync(IEnumerable<T> entities)
{
await _collection.UpdateManyAsync(); // What are the parameters here
}
Run Code Online (Sandbox Code Playgroud)
任何建议表示赞赏!
这可能是您可以执行的最常见和最基本的数据库操作之一。但是,如何在 MongoDb 中执行此操作是难以捉摸的。
UpdateManyAsyncC# 驱动程序中有一个方法。但我能找到的只是这样的例子;
以下操作更新所有违规大于 4 的文档并 $set a flag 以供审查:
try {
db.restaurant.updateMany(
{ violations: { $gt: 4 } },
{ $set: { "Review" : true } }
);
} catch (e) {
print(e);
}
Run Code Online (Sandbox Code Playgroud)
坦率地说,我不知道你们是如何构建应用程序的,但我们的组织永远不会在我们的数据库查询逻辑中嵌入域逻辑,例如有多少违规构成了审查。就像我可以为这个操作找到的所有例子一样。
似乎我们的选择充其量是为此使用某种批量 api,这对于如此简单的操作似乎是不必要的。让批量 API 执行一千次单独的替换对我来说似乎无效,但我可能在这里错了?
在其他存储技术和更成熟的 API 中,执行此操作所需的所有代码是(示例实体框架);
db.UpdateRange(stocks);
await db.SaveChangesAsync();
Run Code Online (Sandbox Code Playgroud)
这是否被跟踪为某个地方的 Mongo 项目的功能请求?
从文档读取隔离一致性 - 会话(强调我的)
为了提供因果一致性,MongoDB 3.6 在客户端会话中启用了因果一致性。因果一致会话表示相关的读取和确认写入操作序列具有因果关系,该因果关系由它们的顺序反映出来。应用程序必须确保一次只有一个线程在客户端会话中执行这些操作。
来自文档交易 - 交易和会话
事务与会话相关联。也就是说,您为会话启动事务。在任何给定时间,一个会话最多可以有一个打开的事务。
这是否说使用 async/await 是不安全的,或者至少所有使用会话和事务的任务都应该 - 不知何故 - 在同一线程上执行?
还是说会话上的每个异步操作都需要完成才能启动另一个?
还是说可以针对会话运行多个异步操作,但所有这些操作必须在同一线程上运行。
tl;dr
对事务使用 async/await 是否安全?如果没有,这里的最佳做法是什么?
例如,这是(公认的可怕代码)好吗?
[HttpPost]
public async Task<IActionResult> PostAsync(CreateRequest createRequest)
{
using (var session = await _client.StartSessionAsync())
{
await session.StartTransactionAsync();
var inserts = new Task[] {
_colHomer.InsertOneAsync(session, createRequest.Homer),
_colMarge.InsertOneAsync(session, createRequest.Marge),
_colBart.InsertOneAsync(session, createRequest.Bart)
};
await Task.WhenAll(inserts);
await session.CommitTransactionAsync();
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试在包含带有 DateTimeOffset 的文档的集合上创建 MongoDB TTL 索引。但是日期作为刻度和偏移量的数组持久化,例如[刻度,偏移量]。例如 :
TimeStamp:Array [
0:636803424000000000,
1:-360]
Run Code Online (Sandbox Code Playgroud)
我的模型如下所示:
public class Log
{
....
DateTimeOffset? TimeStamp{get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 MongoDb.Driver v2.7.2 并且我一直在尝试以这种方式创建索引
....
var indexKeysDefinition = Builders<Log>.IndexKeys.Descending(l => l.TimeStamp);
var indexOptions = new CreateIndexOptions
{
ExpireAfter = TimeSpan..FromTicks(TimeSpan.TicksPerMinute),
Name = "LogsTimeStamPIndex",
Background = true
};
var model = new CreateIndexModel<Log>(indexKeysDefinition, indexOptions);
await _database.GetCollection<Log>("Log").Indexes.CreateOneAsync(model);
....
Run Code Online (Sandbox Code Playgroud)
这是创建索引,但文档不会在 1 分钟后过期。如何为以这种方式存储的 DateTimeOffset 创建 TTL?或者我在这里错过了什么?
尝试从 mongodb 检索对象时出错:
InvalidOperationException:无法使用在抽象类上声明的构造函数编译 NewExpression
我的班级是:
public class App
{
public List<Feature> Features { get; set; }
}
public abstract class Feature
{
public string Name { get; set; }
}
public class ConcreteFeature : Feature
{
public string ConcreteProp { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
不知道为什么它有抽象问题。我明白了,mongodb 记录了_t: "ConcreteFeature"类型名称,它具有反序列化的所有功能。我在抽象类中没有构造函数。
想法?
虽然我用 装饰了我的Datetime财产BsonDateTimeOptions,但它仍然不起作用,时间插入到数据库中,比我的当地时间晚 3 小时。(我认为是 utc)
我的基础抽象类
public abstract class MongoBaseModel
{
public ObjectId Id { get; set; }
[BsonElement]
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime InsertedAt{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的实体
public class RockSongs:MongoBaseModel
{
[BsonElement("Name")]
public string Name { get; set; }
[BsonElement("Singer")]
public string Singer { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
数据库版本 v4.2.1
MongoDb.Driver 2.7.2
我正在尝试执行类似波纹管示例的操作,但得到的异常为 - System.ArgumentException: Expression of type 'System.Collections.Generic.IEnumerable 1 ' cannot be used for parameter of type 'System.Linq.IQueryable1' of method。这是我的代码和相关类。我该如何解决这个问题,除了尝试做之外,还有什么方法可以解决。
var channels = _channelService.Collection;
var tracks = _trackService.Collection;
var query = from b in tracks.AsQueryable()
select b;
var data = (from q in channels.AsQueryable()
from p in q.Episodes
//from x in trackcoll.AsQueryable()
select new
{
p,
Tracks = query.Where(w => p.Tracks.Contains(w.Id))
}).ToList();
// Related classes
public class ContentBase : IAuditable
{
public string Id { get; set ; }
public …Run Code Online (Sandbox Code Playgroud) 正如此处从MongoDB 4.2中所述,可以使用聚合管道更新文档。
这意味着现在可以表达“基于当前字段值的条件更新或使用另一个字段的值更新一个字段”。
例如:
db.members.update(
{ },
[
{ $set: { status: "Modified", comments: [ "$misc1", "$misc2" ], lastUpdate: "$$NOW" } },
{ $unset: [ "misc1", "misc2" ] }
],
{ multi: true }
)
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何在 C# 上使用MongoDB做到这一点?
mongodb ×8
c# ×7
.net-core ×2
asp.net-core ×2
.net ×1
async-await ×1
linq ×1
session ×1
transactions ×1