我正在使用MongoDB 2.2.3的官方C#驱动程序
如何使用C#驱动程序为光标设置批量大小?
使用javascript我可以创建一个游标并为其设置批量大小:
var cursor = db.statistics.find(query).batchSize(100)
Run Code Online (Sandbox Code Playgroud)
我可以使用以下语句遍历所有项目:
while(cursor.objsLeftInBatch()>0){
var doc = cursor.next();
//process doc
}
Run Code Online (Sandbox Code Playgroud)
我想在C#中使用async/await支持具有相同的行为.我知道我可以使用C#中的游标,但它的默认批量大小是4MB.这太匹配了,无法通过一次调用返回客户端.
我们开始使用新的MongoDB驱动程序v2,我们无法理解我们是否连接到数据库.
我们的存储库代码
var client = new MongoClient("mongodb://{wrong-host}:{wrong-port}/{dbbname}");
var database = client.GetDatabase(url.DatabaseName);
Run Code Online (Sandbox Code Playgroud)
凡wrong-host和wrong-port无效的值.
首先,我们认为如果没有人正在监听指定的地址但驱动程序没有抛出异常将被引发.
下一步是在db上调用方法:
var dbs = client.ListDatabasesAsync().Result.ToListAsync().Result;
Run Code Online (Sandbox Code Playgroud)
在这里,我们有freez 30秒而不是例外.我们不适合等待30秒来了解我们是否联系.
System.TimeoutException:使用CompositeServerSelector选择服务器30000ms后发生超时{Selectors = ReadPreferenceServerSelector {ReadPreference = {Mode = Primary,TagSets = []}},LatencyLimitingServerSelector {AllowedLatencyRange = 00:00:00.0150000}}.集群状态的客户端视图是{ClusterId:"1",类型:"未知",状态:"已断开连接",服务器:[{ServerId:"{ClusterId:1,EndPoint:"****"}",EndPoint: "****",状态:"Disconnected",键入:"Unknown",HeartbeatException:"MongoDB.Driver.MongoConnectionException:打开与服务器的连接时发生异常.---> System.Net.Sockets.SocketException :无法建立连接,因为目标计算机主动拒绝它******
最后,我们尝试设置不同的超时但没有任何改变.
var client = new MongoClient(new MongoClientSettings
{
SocketTimeout = TimeSpan.FromSeconds(1),
MaxConnectionIdleTime = TimeSpan.FromSeconds(1),
MaxConnectionLifeTime = TimeSpan.FromSeconds(1),
ConnectTimeout = TimeSpan.FromSeconds(1),
Servers = url.Servers
});
Run Code Online (Sandbox Code Playgroud)
所以问题是如何在短时间间隔〜(1-2)秒内知道我们是否连接到mongo?
[UPD]
我们目前的解决方案是
private IMongoDatabase Connect(string connectionString, TimeSpan timeout)
{
var url = MongoUrl.Create(connectionString); …Run Code Online (Sandbox Code Playgroud) 我在 dotnetcore 2.1 中使用 MongoDB.Driver nuget 包。我试图返回集合中的文档列表,其中子文档字段等于我拥有的列表中包含的任何项目。理想情况下,我需要在 C# 语法中为 dotnetcore 2.1 的 MongoDB.Driver nuget 包提供这个。
文档
{
"_id" : "e29628a65e914c1e91b3fd9cbf6f2353",
"Enabled" : true,
"Name" : "Document123",
"DisplayName" : "Some Document",
"Description" : "Some Description",
"Data" : [
"lastname",
"email",
"firstname",
"zipcode"
],
"Items" : [
{
"_id" : "1",
"Name" : "bob"
},
{
"_id" : "2",
"Name" : "smith"
}
]
}
如果这是 SQL,这就是我想要做的:
SELECT *
FROM Document a, Item b
WHERE a.Id = b.DocumentId AND
b.Name IN ('bob', …
我试图在Scala中打印MongoDB查询的结果
val mongoClient: MongoClient = MongoClient()
val database: MongoDatabase = mongoClient.getDatabase("tableScala")
val collection: MongoCollection[Document] = database.getCollection("tableScala")
collection.find().printResults()
Run Code Online (Sandbox Code Playgroud)
抛出的错误是:Cannot resolve symbol printResults.建议使用mongo-scala-driver版本的一些其他问题的答案1.2,因为版本1.1及以下没有实现printResults()
SBT档案:
name := "scalaMongoDriver"
version := "1.0"
scalaVersion := "2.11.8"
libraryDependencies += "org.mongodb.scala" %% "mongo-scala-driver" % "1.2.0-beta1"
Run Code Online (Sandbox Code Playgroud)
尝试使用以下方式手动打印:
collection.find().subscribe(
(user: Document) => println(user.toJson()), // onNext
(error: Throwable) => println(s"Query failed: ${error.getMessage}"), // onError
() => println("Done") // onComplete
)
Run Code Online (Sandbox Code Playgroud)
得到以下信息:
信息:ReadPreferenceServerSelector {readPreference = primary}从集群描述ClusterDescription {type = UNKNOWN,connectionMode = SINGLE,serverDescriptions = [ServerDescription …
我MongoDB.Drivers在我的C#MVC应用程序中使用与Mongodb数据库进行通信.
C#代码
var client = new MongoClient("mongodb://localhost:27012");
var db = client.GetDatabase("Test_DB");
var collection = db.GetCollection<BsonDocument>("TestTable");
var tData = await collection.FindAsync(new BsonDocument(true)); // I used - new BsonDocument(true) to specify allow duplicate element name while read data.
Run Code Online (Sandbox Code Playgroud)
在上面的图像中,您可以看到我有多个DuplicateCol使用不同值调用的列.当我尝试在c#使用中读取这些数据时MongoDB.Driver出现以下错误:InvalidOperationException: Duplicate element name 'DuplicateCol'.
插入重复元素名称时我使用AllowDuplicateNames=true了BsonDocument如下对象.(它插入重复的元素名称而不会出错.)
BsonDocument obj = new BsonDocument();
obj.AllowDuplicateNames = true;
obj.Add("DuplicateCol", "Value_One");
obj.Add("propone", "newVal");
obj.Add("DuplicateCol", "Value_Two");
.... // other properties with value
await collection.InsertOneAsync(obj);
Run Code Online (Sandbox Code Playgroud)
注意:此架构必须.我无法改变它. …
我们希望将 MongoDB 用于我们的数据库,并且我们希望使用 MongoDB API 来避免“锁定”到 Azure Cosmos DB 托管。
我们使用 .Net Core 和 MongoDB.Driver 包(以便能够在本地、Atlas、Azure Cosmos hsoting 等之间轻松切换)与 MongoDB 实例进行通信,到目前为止一切顺利。
为了能够处理未来数据量(大小和性能)的增长,我希望对我的集合进行分片。据我了解,Cosmos DB 使用的策略是使用分区键进行分区,但由于我们使用 MongoDB.Driver,我无论如何都找不到在查询中指定分区键。
“Plain” MongoDB 使用分片代替,您可以设置一个文档属性,该属性应该用作数据分片方式的分隔符。
所以,我的猜测是分片是要走的路(因为 partionkeys 是 Cosmos 功能),但我无法让它工作。
Azure 门户中的“MongoDB shell”不理解 sh.shardCollection 命令,如果我从客户端连接 MongoDB shell,我会收到以下错误:
globaldb:PRIMARY> use sampledatabase
switched to db sampledatabase
globaldb:PRIMARY> sh.shardCollection("sampledatabase.Event", { TenantId: 1 } )
2018-06-21T12:03:06.522+0200 E QUERY [thread1] Error: not connected to a mongos :
Run Code Online (Sandbox Code Playgroud)
如何继续在 Azure Cosmos 中托管的 MongoDB 实例中启动和运行分片?
我在查询 Mongo-DB 集合时遇到困难。
我正在使用的文档
public class Customer
{
public ObjectId Id { get; set; }
public int CustomerId { get; set; }
public List<Address> Addresses { get; set; }
}
public class Address
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
一些样本数据
{
CustomerId: 2,
Addresses: [
{
Name: "Daniel"
},
{
Name: "Eric"
},
{
Name: "Dan"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我现在想通过 CustomerId 查询文档并过滤一些地址值以返回名称为 %Dan% 的所有地址。由于地址收集可能很大,我想在查询时过滤这些地址
var mdb = mongoClient.GetDatabase("test");
var collection = mdb.GetCollection<WebApi>("Customer");
var builder = Builders<Customer>.Filter;
var …Run Code Online (Sandbox Code Playgroud) 这是我从MongoDb集合中提取的BsonDocument。我想反序列化(或映射)到我在C#中创建的对象/类。
{
"_id" : ObjectId("5699715218a323101c663b9a"),
"type": null,
"text": "Hello this is text",
"user":
{
"hair": "brown",
"age": 64
}
}
Run Code Online (Sandbox Code Playgroud)
这是我想映射/反序列化BsonDocument的类。我班级中的字段是我要检索的唯一字段。
public class MyType
{
public BsonObjectId _id { get; set; }
public BsonString text { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当前,这就是我试图这样做的方式,但是我收到一个错误,指出“元素'类型'与类MyType的任何字段或属性都不匹配”。我不想在MyType类中包括“类型”字段。
var collection = db.GetCollection<BsonDocument>("data_of_interest");
var filter = new BsonDocument();
var myData = collection.Find(filter).FirstOrDefault();
MyType myObject = BsonSerializer.Deserialize<MyType>(myData);
Run Code Online (Sandbox Code Playgroud)
我在最后一行遇到了错误。在此示例中,我尝试仅对MyType对象的一个实例的一个文档执行此操作。我还对如何将整个集合反序列化为MyType对象或类似对象的列表感兴趣,该对象不仅针对一个BsonDocument,而且针对我的集合中的所有文档。
谢谢你的时间。
mongodb ×8
c# ×5
asp.net ×1
asp.net-mvc ×1
bson ×1
c#-4.0 ×1
nosql ×1
partitioning ×1
scala ×1
sharding ×1