标签: mongodb-.net-driver

如何在不使用 eval 的情况下在 Mongo C# 驱动程序中使用自动增量字段?

我正在使用这里讨论的自动增量 fild 。

我可以在 Mongo 控制台中执行这个例子,但是我如何使用 c# 驱动程序实现这样的事情?

db.products.insert({
     "_id":getNextSequenceValue("productid"),
     "product_name":"Apple iPhone",
    "category":"mobiles"
})
Run Code Online (Sandbox Code Playgroud)

是否可以在写操作中指定一个函数?

我可以使用 Eval 调用这个函数,但由于它已被弃用,我想找到一个不使用它的解决方案。

mongodb-.net-driver

5
推荐指数
1
解决办法
6758
查看次数

如何使用 UpdateManyAsync 更新多个文档

我有以下方法来更新 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 mongodb-query mongodb-.net-driver

5
推荐指数
1
解决办法
4770
查看次数

如何在 MongoDb 中简单地执行更新/替换多个文档操作

这可能是您可以执行的最常见和最基本的数据库操作之一。但是,如何在 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 mongodb-query mongodb-.net-driver

5
推荐指数
1
解决办法
4377
查看次数

在 C# 异步代码中使用 MongoDB ClientSessions &amp; Transactions 是否安全?

从文档读取隔离一致性 - 会话强调我的

为了提供因果一致性,MongoDB 3.6 在客户端会话中启用了因果一致性。因果一致会话表示相关的读取和确认写入操作序列具有因果关系,该因果关系由它们的顺序反映出来。应用程序必须确保一次只有一个线程在客户端会话中执行这些操作

来自文档交易 - 交易和会话

事务与会话相关联。也就是说,您为会话启动事务。在任何给定时间,一个会话最多可以有一个打开的事务。

  1. 这是否说使用 async/await 是不安全的,或者至少所有使用会话和事务的任务都应该 - 不知何故 - 在同一线程上执行?

  2. 还是说会话上的每个异步操作都需要完成才能启动另一个?

  3. 还是说可以针对会话运行多个异步操作,但所有这些操作必须在同一线程上运行。

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)

c# session transactions async-await mongodb-.net-driver

5
推荐指数
1
解决办法
1232
查看次数

MongoDatabase 和 MongoCollection 可以是单例吗

我目前正在使用,MongoDriver并且根据文档,只MongoClient需要成为单身人士。

那讲得通。但是,在研究过程中,我在 SO 上发现了一些旧帖子。接受的答案(这是6岁)在这里建议,不仅可以MongoServer是一个单,但这样可以把MongoDatabaseMongoCollection。然而,最近的一篇关于 Java MongoDriver 的帖子(2 年前)反驳了这一点,该帖子表明只有MongoClient应该是单例,因为其他连接可能会变得陈旧。


我最初的想法是我链接的最近的帖子,MongoClient应该是唯一的单身人士,但考虑到相互矛盾的意见,我只是想确定一下。

谢谢。

c# mongodb .net-core mongodb-.net-driver

5
推荐指数
1
解决办法
785
查看次数

如何为存储为数组 [ticks,offset] 的 DatetimeOffset 创建 MongoDB TTL 索引?

我正在尝试在包含带有 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?或者我在这里错过了什么?

c# mongodb mongodb-.net-driver

5
推荐指数
1
解决办法
739
查看次数

InvalidOperationException:无法使用在抽象类上声明的构造函数编译 NewExpression

尝试从 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"类型名称,它具有反序列化的所有功能。我在抽象类中没有构造函数。

想法?

.net c# mongodb .net-core mongodb-.net-driver

5
推荐指数
2
解决办法
3844
查看次数

BsonDateTimeOptions 不设置本地日期时间

虽然我用 装饰了我的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

c# mongodb mongodb-.net-driver asp.net-core

5
推荐指数
1
解决办法
1073
查看次数

使用 C# LINQ 和 MongoDB 对嵌入/嵌套文档进行子查询或联接

我正在尝试执行类似波纹管示例的操作,但得到的异常为 - 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)

c# linq mongodb mongodb-.net-driver

5
推荐指数
1
解决办法
727
查看次数

带有聚合管道的 MongoDB C# 驱动程序更新文档

正如此处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做到这一点?

c# mongodb mongodb-.net-driver asp.net-core

5
推荐指数
1
解决办法
1164
查看次数