因此,我想做的是查询所有包含“巴黎”市和“法国”州的文档。我需要进行某种连接,但我无法弄清楚如何构建它。
我正在使用 c# 驱动程序,但我很乐意接受使用任何方法的帮助。
{
"_id" : ObjectId("519b407f3c22a73a7c29269f"),
"DocumentID" : "1",
"Meta" : [{
"Name" : "City",
"Value" : "Paris",
}, {
"Name" : "State",
"Value" : "France",
}
}]
}
{
"_id" : ObjectId("519b407f3c22a73a7c29269g"),
"DocumentID" : "2",
"Meta" : [{
"Name" : "City",
"Value" : "Paris",
}, {
"Name" : "State",
"Value" : "Texas",
}
}]
}
Run Code Online (Sandbox Code Playgroud) I use Moq to mock the GetCollection method but the line crashes.
var collectionSettings = new MongoCollectionSettings
{
GuidRepresentation = GuidRepresentation.Standard,
ReadEncoding = new UTF8Encoding(),
ReadPreference = new ReadPreference(),
WriteConcern = new WriteConcern(),
WriteEncoding = new UTF8Encoding()
};
var collection = new Mock<MongoCollection<BsonDocument>>(database.Object, "MyCollection", collectionSettings);
//crashing here without any error dumped
database.Setup(f => f.GetCollection("MyCollection", collectionSettings)).Returns(collection.Object);
Run Code Online (Sandbox Code Playgroud)
This is the error I got
Exception of type 'System.ArgumentOutOfRangeException' was thrown.
Parameter name: name
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at …Run Code Online (Sandbox Code Playgroud) 我正在编写 C# 代码来从现有 MongoDB 数据库中提取数据并将其放入各种 C# 类中。数据库的一部分是多态的:如果字段type是 A,则该文档中将存在一组特定字段。如果type是B,则将存在一组不同的字段。这是 的完美用例ScalarDiscriminatorConvention,所以我正在使用ScalarDiscriminatorConvention("type"). 但我不知道如何让 MongoDB 驱动程序使用该约定!
关于约定的 MongoDB 手册页让我认为这可行:
var pack = new ConventionPack();
pack.Add(new CamelCaseElementNameConvention());
pack.Add(new ScalarDiscriminatorConvention("type"));
ConventionRegistry.Register(
"My Custom Conventions",
pack,
t => t.FullName.StartsWith("MyNamespace."));
Run Code Online (Sandbox Code Playgroud)
但这会失败,因为它不像其他约定那样ScalarDiscriminatorConvention从接口派生。IConvention它派生自IDiscriminatorConvention,这是它自己的接口,但不派生自IConvention。并ConventionPack.Add期望一个IConvention参数。
那么如何注册不同的鉴别器字段呢?我已经翻阅 MongoDB 手册至少一个小时了,但我很茫然。他们似乎没有在我能找到的任何地方记录它。
我直接在 Mongo 中运行查询select all items where field1=x, field2 =y, and field3=z(Robomongo、CLI,等等),对数十万个项目只需要不到一秒的时间:
db.items.find( {
$and: [
{ CreatingOrgId: 1 },
{ LocationId: 941 },
{ StatusId: 1}
]
} )
Run Code Online (Sandbox Code Playgroud)
然后,我尝试从 C# 驱动程序运行完全相同的东西,但它滞后了(只有“聚合过滤器”代码相关,其他所有内容都用于上下文):
FilterDefinition<BsonDocument> locationsFilter; = Builders<BsonDocument>.Filter.Eq("LocationId", 941);
FilterDefinition<BsonDocument> orgFilter = Builders<BsonDocument>.Filter.Eq("CreatingOrgId", 1);
FilterDefinition<BsonDocument> statusFilter = Builders<BsonDocument>.Filter.Eq("StatusId", 1);
FilterDefinition<BsonDocument> aggregateFilter = locationsFilter & statusFilter & orgFilter;
List<ItemViewModel> stuffList = mongoItemsCollection
.Find(aggregateFilter)
.Project(x => Mapper.Map<BsonDocument, StuffViewModel>(x))
.ToListAsync().Result;
Run Code Online (Sandbox Code Playgroud)
我在这里犯了什么错误?以下是 mongo 看到的查询:
编辑:看起来将项目映射到项目对象是在某种程度上杀死我的查询的原因。如果没有映射,它的速度相当快(大量记录只需几秒钟),如下所示:
var rawItems = mongoItemsCollection
.Find(aggregateFilter)
.ToListAsync().Result;
Run Code Online (Sandbox Code Playgroud)
编辑2:看起来automapper是这里问题的一个重要部分(采用bson“item”对象并将其转换为.NET视图模型)。如果有人想回答的话,我仍然对 .NET --> …
我创建了一个示例 c# 控制台应用程序来连接到 Docker 上的 CentOS 计算机上托管的 mongodb。
用于创建容器的命令如下:
docker run -d --name mongodb-container -p 2020:27017 -v /home/mongodb_data:/var/lib/mongodb/data -v /home/mongodb_log:/var/log/mongodb -v /home/mongod. conf:/etc/mongod.conf -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=秘密 mongo
系统IP:172.17.103.158
Mongodb docker端口:2020
现在来看看 C# 代码
class users
{
[BsonId]
public ObjectId _Id { get; set; }
[BsonElement]
public string name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
MongoContext 类
public class MongoContext
{
IMongoClient _client;
public readonly IMongoDatabase _database;
public MongoContext()
{
MongoCredential credential = MongoCredential.CreateCredential(ConfigurationManager.AppSettings["MongoDatabaseName"], ConfigurationManager.AppSettings["MongoUsername"], ConfigurationManager.AppSettings["MongoPassword"]);
var settings = new MongoClientSettings …Run Code Online (Sandbox Code Playgroud) 我有一个名为 test1 的视图,其中包含自定义的高级查询。
是否可以使用 mongo csharp 驱动程序将数据从名为 test1 的视图检索到 C# 应用程序?
信息:
*我是 MongoDB 和 mongo csharp 驱动程序的新手。
谢谢你!
我在将查询(相对简单)从 Mongo Shell 转换为 C#(可以是 linq 或过滤器生成器)时遇到问题。我想按某些字段(在我的示例中EntityId)ActivityDate和数组上存在的字段(在我的示例中UnCommonFields)进行查询。
数据示例:
{
"_id" : ObjectId("5ded105e90424e1c0e6fda05"),
"EntryId" : NumberLong(1111111),
"EntityId" : "10000007",
"EntityType" : NumberInt(5),
"ActivityItemId" : "1,4,16172532",
"ActivityDate" : ISODate("2015-04-13T03:50:55.000-0400"),
"CreateDate" : ISODate("2017-12-13T19:07:07.757-0500"),
"UpdateDate" : ISODate("2017-12-13T19:07:07.757-0500"),
"ActivityItemStatus" : NumberInt(2),
"ActivityTypeId" : NumberInt(2),
"Currency" : "USD",
"Amount" : "-10.7800",
"ActivityItemDescription" : "Stackoverflow example",
"DisplayLevel" : NumberInt(10),
"UnCommonFields" : [
{
"k" : "CardPresent",
"v" : NumberLong(2)
},
{
"k" : "PreAuthDate",
"v" : ISODate("2015-04-11T08:47:05.000-0400")
},
{
"k" : …Run Code Online (Sandbox Code Playgroud) 我有一个类,其中包含一些我想使用 mongodb 存储的只读属性。
用户.cs
public class User: ValueObject<User>
{
public UserId Id { get; }
public string Firstname { get; }
public string Lastname { get; }
public User(UserId id, string firstname, string lastname)
{
Id = new UserId(id.Id);
Firstname = firstname;
Lastname = lastname;
}
public User(string id, string firstname, string lastname)
{
Id = new UserId(id);
Firstname = firstname;
Lastname = lastname;
}
protected override bool MembersEquals(User other)
{
return Id == other.Id && Firstname == other.Firstname && …Run Code Online (Sandbox Code Playgroud) 我有一个 MongoDB 集合“Posts”,其中包含如下数据:
{
"_id": UUID('5fd671be-df7c-4dd2-87dc-9877a7fb1953'),
"EditorId": UUID('f79fc0d8-0200-4eef-91c2-4062ee9a2354'),
"Name": "Name 01"
}
Run Code Online (Sandbox Code Playgroud)
在 C# 中,我尝试获取特定 EditorId 的所有记录,我尝试了以下操作:
BsonDefaults.GuidRepresentation = GuidRepresentation.Standard;
var postsCollection = _database.GetCollection<BsonDocument>("Posts");
var postsCollection2 = _database.GetCollection<Post>("Posts");
Guid editorId = ...
var postsDocs = postsCollection.Find(Builders<BsonDocument>.Filter.Eq("EditorId", editorObj.Id)).ToList();
var posts = postsCollection2.Find(p => p.EditorId == editorObj.Id).ToList();
Run Code Online (Sandbox Code Playgroud)
但这些方法都行不通,我没有结果!您对这个问题以及如何解决这个问题有任何想法吗?
谢谢
当您在MongoDB控制台中以管理员用户(管理员数据库的用户)身份登录时,便可以完全访问同一服务器上的任何数据库,而无需登录每个数据库。但是,如果我使用官方的C#驱动程序并提供到管理数据库的连接字符串,那么当我尝试访问任何其他数据库时,都会收到身份验证错误。这是在MongoServerInstance.AcquireConnection()中发生的,它试图重新验证连接并针对其他数据库(当然会失败)检查管理数据库凭据。
我想要实现的是-我提供了管理员连接字符串,无需访问每个数据库即可访问所有数据库,就像控制台一样
我可以做些什么来使C#驱动程序在身份验证方面与控制台相同?