标签: mongodb-.net-driver

使用mongo C#驱动程序在嵌入式文档中维护Id属性名称

我有一个包含一系列嵌入文档的mongo文档.嵌入的文档具有名为"Id"的属性.

{ Name: "Outer object", Embedded: [ {Name: "Embedded A", Id: "5f1c591a71dc237199eeaeda"} ] }
Run Code Online (Sandbox Code Playgroud)

我的C#映射对象看起来像这样(显然是简化)

public class Outer
{
    public string Name { get; set; }
    public IEnumerable<Inner> Inners { get; set; }
}

public class Inner
{
    public string Name { get; set; }
    public string Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我写一个外部数据库时,C#驱动程序将Inner.Id属性的名称更改为_id.如何绕过这种自动重命名?我尝试在Id属性上使用[BsonElement("Id")]属性,但它没有帮助.

c# mongodb mongodb-.net-driver

9
推荐指数
1
解决办法
3905
查看次数

使用MongoDB C#驱动程序查询构建器获取项目计数

使用MongoDB的c#驱动程序,我可以轻松地构建一个查询,然后我可以添加SetSkip()和SetLimit()参数来将结果集限制为一定的大小.

但是我希望能够在执行查询并将整个结果集(可能很大)加载到内存中之前应用Skip和Take之前知道查询的项目数.

看起来我可以通过使用count()命令直接通过shell对MongoDB执行此操作.例如:

 db.item.find( { "FieldToMatch" : "ValueToMatch" } ).count()
Run Code Online (Sandbox Code Playgroud)

这只返回一个整数,这正是我想要的.但我在文档中看不到通过C#驱动程序执行此操作的方法.可能吗?

(应该注意的是,我们已经广泛使用了查询构建器,所以理想情况下我宁愿通过查询构建器执行此操作,而不是通过驱动程序向shell发出命令,如果可能的话.但如果这是唯一的话解决方案然后一个例子会有所帮助,谢谢.)

干杯,马特

mongodb mongodb-.net-driver

9
推荐指数
1
解决办法
1万
查看次数

MongoDB.Bson.dll中发生了System.FormatException - XXX不是有效的24位十六进制字符串

我创建了一个这样的C#类:

 public class Employee
    {
        [BsonRepresentation(BsonType.ObjectId)]
        public string Name { get; set; }
        public int Age { get; set; }
        public List<string> Address { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

当我尝试保存此信息(使用MongoDB)时,如下所示:

   var e = new Employee();
    e.Address = new List<string>();
    e.Address.Add("Address 1");
    e.Address.Add("Address 2");

    e.Age = 333;
    e.Name = "Some Name";

   context.Employees.Insert(e);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

An unhandled exception of type 'System.FormatException' occurred in MongoDB.Bson.dll

Additional information: 'Some Name' is not a valid 24 digit hex string.
Run Code Online (Sandbox Code Playgroud)

如何使字符串字段ObjectID在MongoDB中起作用?

c# mongodb mongodb-.net-driver

9
推荐指数
1
解决办法
9273
查看次数

找不到匹配的创建者

最近我已经从mongosharp 1.8迁移到2.0.我遇到的唯一问题是聚合日期字段.让我告诉你如何构造查询:

var aggregateResult = Items.Aggregate()
    .Group(
        g => new {
            // some fields
            Day = g.DateTime.DayOfYear
        },
        z => new {
            MyKey = z.Key
            // agrregation functions
        })
    .Project(
        d => new {
            // projection for other fields
            d.MyKey.Day
        });
Run Code Online (Sandbox Code Playgroud)

我在文档中使用了这个例子.

我得到以下异常:No matching creator found.我已检查生成的查询并手动执行它 - 结果很完美.再现测试代码并与我比较我发现问题是在日期.那么,有人能指出我更正日期的语法/查询规则吗?下面生成的查询证明查询是正确的.

aggregate(
[
    {
        "$group" : {
            "_id" : {
                "Day" : {
                    "$dayOfYear" : "$DateTime"
                }
            },
        }
    },
    {
        "$project" : {
            "Day" : "$_id.Day", …
Run Code Online (Sandbox Code Playgroud)

c# mongodb aggregation-framework mongodb-.net-driver

9
推荐指数
2
解决办法
2270
查看次数

C#mongodb驱动2.0 - 如何在批量操作中进行upsert?

我从1.9迁移到2.2并阅读文档我惊讶地发现在批量操作期间不可能进行升级,因为操作不允许选项.

bulkOps.Add(new UpdateOneModel<BsonDocument>(filter, update));
collection.BulkWrite(bulkOps);
Run Code Online (Sandbox Code Playgroud)

应该

options.isUpsert = true;
bulkOps.Add(new UpdateOneModel<BsonDocument>(filter, update, options));
collection.BulkWrite(bulkOps);
Run Code Online (Sandbox Code Playgroud)

这项工作正在进行中,有意或者我遗失了什么?谢谢.

c# bulk mongodb batch-processing mongodb-.net-driver

9
推荐指数
2
解决办法
7952
查看次数

是mongodb原子中的upsert与过滤器和实际更新

我有一个我想要插入的文档.它有一个属性的唯一索引,所以我有这样的东西,以确保我没有碰撞

var barVal = 1;

collection.UpdateOne(
     x=>x.Bar == barVal,
     new UpdateDefinitionBuilder<Foo>().Set(x=>x.Bar, barVal),  
     new UpdateOptions { IsUpsert = true });
Run Code Online (Sandbox Code Playgroud)

但我似乎有时会在条形图上的唯一索引上发生碰撞.

围绕upserts是mongo原子,所以如果过滤器匹配文档,则在更新完成之前无法更改?

如果它是我可能在其他地方有问题,如果它不是我需要处理事实不是.

文档似乎并没有暗示这是另一种方式.

https://docs.mongodb.com/v3.2/reference/method/Bulk.find.upsert/ https://docs.mongodb.com/v3.2/reference/method/db.collection.update/

c# mongodb mongodb-.net-driver

9
推荐指数
1
解决办法
697
查看次数

插入不创建ID?

我用getter和setter创建了一个简单的对象:

public class MemberCanonical : IMemberCanonical
{
    public ObjectId Id { get; set; }
    public String username { get; set; }
    public String email { get; set; }
    public String status { get; set; }
    public IEnumerable<string> roles { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在我想在数据库中插入一个新成员:

try
{
    memberObj.username = username;
    memberObj.email = email;
    memberObj.status = "active";
    // memberObj.Id = new ObjectId().ToString();
    this.membershipcollection.Insert(memberObj, SafeMode.True);
    return true;
}
catch(Exception ex)
{
    return false;   
}
Run Code Online (Sandbox Code Playgroud)

我希望insert能够创建一个唯一的_id(Id),但这并没有发生.当我查看_id字段时插入,我得到"0000000 ...."

为了让Mongo在插入时生成自己的_id,我需要做什么?

c# mongodb mongodb-.net-driver

8
推荐指数
1
解决办法
5994
查看次数

Mongo Vs Raven评估

我正在评估nosql数据库并最终确定了两个.RavenDB和MongoDb.哪一个更好,为什么?这将有助于编写更多面向性能的查询.

mongodb ravendb mongodb-.net-driver

8
推荐指数
1
解决办法
7648
查看次数

旧的.net驱动程序MongoCollection.Save的新选择?

我有一些C#代码使用旧的1.x版本的MongoDB驱动程序,它提供了使用该MongoCollection.Save()方法的通用保存方法.但是在升级到2.0之后,这个方法似乎已经消失,并被一个Update方法所取代,该方法需要指定对象上的所有更新字段(这对于通用方法显然没有好处......)

如何在2.0驱动程序中保留旧Save方法的功能(即只传入一个对象以更新所有字段)?

.net c# mongodb mongodb-csharp-2.0 mongodb-.net-driver

8
推荐指数
1
解决办法
1802
查看次数

使用C#驱动程序分页MongoDB查询

我使用的是用于C#的2.2版MongoDB驱动程序.我想对查询进行分页:对查询的响应必须包含当前页面的项目以及与查询匹配的项目总数.

我想做一个查询.使用mongo shell我可以意识到:

var c = db.mycol.find({....}).skip(0).limit(10)
var total = c.count();
while (c.hasNext()) {
   print(tojson(c.next()));
}
Run Code Online (Sandbox Code Playgroud)

但是使用C#驱动程序,我不知道如何只使用一个查询.

var find = collection
  .Find(x => x.Valid == true)
  .Skip(0)
  .Limit(10);

var cursor = await find.ToCursorAsync(cancellationToken);
// How to get the count? There is no method in the IAsyncCursor interface.
Run Code Online (Sandbox Code Playgroud)

可能吗 ?一些想法?

c# mongodb mongodb-csharp-2.0 mongodb-.net-driver

8
推荐指数
1
解决办法
8075
查看次数