我用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,我需要做什么?
我正在尝试编写一个通用的Web Api控制器,它允许我将JSON文档保存到集合中而不指定C#类型.我试图将代码压缩到基本要素:
public class PassThroughController : ApiController
{
[Route("api/mongodb/{collection}")]
public void Post(string collection, dynamic document)
{
const string connectionString = "mongodb://localhost";
var client = new MongoClient(connectionString);
var db = client.GetServer().GetDatabase("SampleDb");
var mongoCollection = db.GetCollection(collection);
mongoCollection.Save(document,
new MongoInsertOptions
{
WriteConcern = WriteConcern.Acknowledged
});
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试发布一个简单的文档:
{ id: "2112", name: "Rush" }
Run Code Online (Sandbox Code Playgroud)
但无论我发送给方法的是什么,我都会收到与此类似的错误:"保存只能用于具有Id的文档."
我们尝试了Id(Id,id,_id)的许多不同属性,但它们都会导致类似的问题.
有任何想法吗?
谢谢
我有一些C#代码使用旧的1.x版本的MongoDB驱动程序,它提供了使用该MongoCollection.Save()方法的通用保存方法.但是在升级到2.0之后,这个方法似乎已经消失,并被一个Update方法所取代,该方法需要指定对象上的所有更新字段(这对于通用方法显然没有好处......)
如何在2.0驱动程序中保留旧Save方法的功能(即只传入一个对象以更新所有字段)?
我使用的是用于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#驱动程序(1.x),我可以这样做:
var client = new MongoClient(settings);
var server = client.GetServer();
server.Shutdown();
Run Code Online (Sandbox Code Playgroud)
如何使用驱动程序版本2.2.3执行此操作?
更新
我能找到的最好的东西是这样的:
try
{
var client = new MongoClient(settings);
var adminDatabase = client.GetDatabase("admin");
var cmd = new BsonDocument("shutdown", 1);
adminDatabase.RunCommand<BsonDocument>(cmd);
}
catch (MongoConnectionException e)
{
if (!(e.InnerException is EndOfStreamException))
{
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
但我真的不喜欢这个,Try/catch等......
以下查询有效:
return Database
.GetCollection<MyEntity>()
.AsQueryable()
.Where(x => x.StartDate <= instance && x.EndDate >= instance)
.GroupBy(x => x.Key.Guid)
.Select(x => x.First().Id)
.ToList();
Run Code Online (Sandbox Code Playgroud)
但是,当添加$ in条件(见下文)时,抛出以下异常:
应用程序抛出了未处理的异常.System.NotSupportedException:$ project或$ group不支持First({document} {_ id})
return Database
.GetCollection<MyEntity>()
.AsQueryable()
.Where(x => guidKeys.Contains(x.Key.Guid)) // $in condition
.Where(x => x.StartDate <= instance && x.EndDate >= instance)
.GroupBy(x => x.Key.Guid)
.Select(x => x.First().Id)
.ToList();
Run Code Online (Sandbox Code Playgroud)
我知道驱动程序尚不支持很多LINQ,但我无法理解如何引入添加匹配阶段(使用$ in)可能导致分组阶段不兼容.
有人能够解释为什么会这样吗?
我使用MongoDB 3.2和.NET驱动程序2.2.2.
MyEntity 看起来像这样:
[BsonIgnoreExtraElements]
public class MyEntity: BaseMongoDocument
{
[BsonId]
[BsonRepresentation(BsonType.Binary)]
public Guid Id { get; set; }
[BsonRequired]
[BsonElement("startDate")]
public …Run Code Online (Sandbox Code Playgroud) Clients我目前正在寻找基于数组的特定顺序对子文档进行排序。
mongoDB的结构是
{
"_id" : "1033",
"Name" : "Test",
"Clients" : [
{
"Id" : 1033,
"Types" : [
{
"Class" : "C",
"Service" : null
},
{
"Class" : "B",
"Service" : null
}
]
},
{
"Id" : 156136,
"Types" : [
{
"Class" : "A",
"Service" : null
},
{
"Class" : "B",
"Service" : null
},
{
"Class" : "C",
"Service" : null
},
{
"Class" : "D",
"Service" : null
}
]
}
] …Run Code Online (Sandbox Code Playgroud) 如何使用 C# 过滤和添加/更新 mongodb 文档的第三、第四级子级。我可以添加/更新到第二级,但不能更进一步。请为我提供解决方案或任何可以从哪里获得帮助的参考资料。除了builders..Elemmatch之外,还有其他方法可以做到吗?
这是我的课程和代码:
namespace CrudWithMultilvelNestedDoc
{
public class Channel
{
[BsonId]
[BsonRepresentation(BsonType.String)]
public string Id { get; set; }
public string Name { get; set; }
public Episode[] Episodes { get; set; }
}
public class Episode
{
[BsonId]
[BsonRepresentation(BsonType.String)]
public string Id { get; set; }
public string Name { get; set; }
public Track[] Tracks { get; set; }
}
public class Track
{
[BsonId]
[BsonRepresentation(BsonType.String)]
public string Id { get; set; }
public string …Run Code Online (Sandbox Code Playgroud) 我正在关注使用 ASP.NET Core 和 MongoDB教程创建 Web API
而且我缺少一些非常基本的东西,即如何序列化具有可能是“多类型”属性的 Json 对象。也就是说,这个属性可以是一个字符串,也可以是另一个对象。
这是教程中的原始 Json 示例:
{
"_id" : ObjectId("5bfd996f7b8e48dc15ff215d"),
"Name" : "Design Patterns",
"Author" : "Ralph Johnson"
}
Run Code Online (Sandbox Code Playgroud)
这是教程中的原始 POCO 模型:
public class Book
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
[BsonElement("Name")]
public string BookName { get; set; }
public string Author { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我在 WebApi 控制器上调用“发布”和“获取”操作时,原始 Json 模型被正确序列化为 Book 实例,保存到数据库中并按预期从 Web 服务中正确检索。
但是,我需要添加一个“MultiUse”属性,其中MultiUse可以是字符串或对象,也可以是其他内容,例如:
{
"_id" : ObjectId("5bfd996f7b8e48dc15ff215d"),
"Name" : "Design …Run Code Online (Sandbox Code Playgroud) 我需要使用 MongoDB 中的运算符执行分组$max。我找出了在 MongoDB 数据库中运行的查询,但无法使用 C# 编写相同的查询。
db.getCollection('Employee').aggregate(
[
{$unwind : "$Projects"},
{
"$group" : {
"_id" : "$EmpId",
"LastUpdated" : {"$max" : "$Projects.LastUpdated"}
}
}
]);
Run Code Online (Sandbox Code Playgroud)
下面的 C# 代码出现错误:
“项目”不是有效的财产。
db.getCollection('Employee').aggregate(
[
{$unwind : "$Projects"},
{
"$group" : {
"_id" : "$EmpId",
"LastUpdated" : {"$max" : "$Projects.LastUpdated"}
}
}
]);
Run Code Online (Sandbox Code Playgroud)