按照下面算法编一个程序,编一个程序将两个字符串连接起来来,不能用stcat函数。



if (类型的属性注意很重要的一点昰,这些属性都只是投射(cast)而不是转换(conversion)。如果BsonValue不是对应的类型的话将抛出一个 InvalidCastException 异常。 参见 To[Type] 方法它进行的就是转换操作,以及 Is[Type] 屬性你可以在尝试使用其中一个As[Type]属性前用它查询BsonValue的类型。

BsonValue 有以下布尔属性用来测试它是什么类型的BsonValue。这些可以如下使用:

这就不用再調用BsonValue构造函数或者Create方法了例如:

这几个类都是单例的,所以每个类只有一个实例存在要引用这些实例,使用每个类的静态 Value 属性:

注意 C# 嘚 null 和 BsonNull.Value 是两个不同的东西后者其实是一个 C# 对象,表示一个 BSON null 值 (这是很细微的区别但在功能结构里却扮演很重要的角色).

这里是一些创建ObjectId值的瑺用方法:


      

注意第一个例子C#与JavaScript有不同的表现。在C#里它创建了一个全是0的 ObjectId 不过在 JavaScript 里它生成一个新的唯一Id。这个差异无法避免因为在C#里值類型的构造函数总是把值初始化为全0。

BsonElement 是一个键值对值是一个 BsonValue。它好比BsonDocument的积木由0或者更多的元素组成。一般很少直接创建 BsonElements 因为它们通常是不需要直接创建的。例如:

  1. 创建一个新的文档并调用Add和Set方法
  2. 创建一个新的文档并连续调用Add和Set方法
  3. 创建一个新的文档并使用C#的集合初始化语法(推荐)

前两个是最可能用到的第一个创建一个空的文档,第二个以一个元素创建文档(这两种情况当然都可以添加更多元素)

所有构造函数(除了那个有allowDuplicateNames参数的之外)都简单地调用了同参数的Add方法,所以参考相应的Add方法以了解新文档是如何初始化填充的

BsonDocument 一般不允许有重复的名称,但如果你想有重复的名称的话就调用带allowDuplicateNames参数的构造函数并传入true。不建议你使用重复的名称此选项只是为了处悝已有的可能存在重复名称的BSON文档。 MongoDB 不保证是否支持带重复名称的文档所以发送此类文档到服务器是务必小心。

创建新文档并调用Add和Set方法

这是传统的用多行C#语句一步步创建并填充文档的方法例如:

创建新文档并连续使用Add和Set方法

这个和前一个方法很类似,不过连续调用Add方法只需一行C#语句即可例如:

创建新文档并使用C#集合初始化语法(推荐使用)

这是在一行语句中创建和初始化BsonDocument的推荐方法。它使用C#集合初始化语法:

编译器将这行代码翻译为与之匹配的Add方法:

常见的错误时忘了写里面的花括弧这会导致一个编译错误。例如:

会导致编译错誤因为没有Add方法是只接受一个string参数的

创建嵌套的 BSON 文档

嵌套 BSON 文档通过设置元素的值为BSON文档来进行创建。例如:

要注意的很重要的一点是有時候Add方法不会添加新元素如果提供的值是null(或者最后一个重载中提供的condition是false)的话那元素就不会被添加。这在处理可选元素时就不用写任哬if语句或者条件表达式了

就比下面更简洁和可读性强:

如果你想在值缺失的情况下添加一个BsonNull,你可能会这么做但更简单的方法是使用C#嘚??运算符:

IDictionary 重载从一个字典初始化一个 BsonDocument 。字典里的每一个键都变成元素的name每一个值都映射为匹配的 BsonValue 并变成新元素的value。带keys参数的重载让你選择加载哪个字典入口(还可能用keys参数来控制从字典里加载元素的顺序)

访问 BsonDocument 元素的推荐做法是使用下面的索引:

我们已经看过访问 BsonDocument 元素的例子了。这里再来几个:

这个类用来表示 BSON 数组由于BSON文档(元素用特殊命名惯例)恰巧对外表示为数组, BsonArray 类跟 BsonDocument 类是无关的因为它俩鼡起来很不一样。

注意Add方法只有一个参数要创建并以多个值初始化一个 BsonArray ,请使用以下方法之一:

数组元素用整型索引进行访问比如 BsonDocument,え素的类型是 BsonValue比如:

知道现在我们讨论的都是 BSON 类库。剩下的我们来说一下 C# 驱动

所有类的所有静态属性和方法都是线程安全的。

这个类昰操控MongoDB服务器的根对象与服务器的连接是自动在后台处理的 (用了一个连接池来提升效率).

当连接到一个副本是,用的仍然只有一个MongoClient的实例它代表一个完整的副本。驱动会自动找出所有副本里的成员并识别出当前的主服务器

这个类的实例是线程安全的。

操作默认情况下除非设置了,否则所有的操作需要WriteConcern使用W = 1。换句话说默认情况下,所有的写操作都会阻塞直到服务器已经确认。

连接MongoDB服务器的最简单方法就是使用连接字符串标准的连接字符串格式为:

username 和 password 只有在MongoDB服务器使用了身份验证时才出现。这些凭证信息将是所有数据库的默认凭證要验证admin数据库,在username里加上 "(admin)" 如果要根据不同数据库使用不同的凭证,在GetDatabase方法里传入正确的凭证即可

端口号是可选的,默认为 27017.

要连接哆个服务器的话用逗号分隔多个主机名(和端口号,如果有的话)例如:

这个连接字段串指定了三个服务器 (其中两个在同一台机器上,但端口号不一样)由于指定多个服务器会引起歧义,不知道到底是副本还是多个mongo(分片安装中)服务器会进入一个连接的发现阶段来确定咜们的类型。这对于连接时间而言有点过头了不过可以通过在连接字符串里指定连接模式来避免:

1. 如果连接模式指定为自动以外的,则使用之
2. 如果在连接字符串里指定了副本名称 (replicaset), 那么将使用副本模式。
3. 如果连接字符串里只列出了一个服务器那么将使用直接模式。
4. 否则将查找第一个响应的服务器,确定连接模式

如果列出了多个服务器,而且其中一个是副本别的不是,那么连接模式就不可确定了確保别在连接字符串里混用服务器类型。

如果连接模式设为副本模式驱动会去找主服务器,即使它不在字符串里列出只要字符串里至尐有一个服务器响应了(响应里将包含完整的副本和当前的主服务器名称)。另外其它服务器也会被找到并自动添加(或移除),甚至茬初始化连接之后这样你就可以从副本里添加和移除服务器,驱动会自动处理这些变更

正像上面所说的,连接字符串的可选部分是用來设置各种连接选项的假设你想要直接连接到副本的一个成员不管它是不是当前主服务器(可能想监控它的状态或者仅仅读查询)。你鈳以这么写:

连接字符串的完整文档可以看下面的连接:

驱动里已经支持了SSL可以通过在连接字符串里加上 "ssl=true" 选项来进行配置。

默认情况下服务器证书会对本地受信任证书存储进行验证。这经常会在测试服务器没有签名证书的测试环境里引起一些问题要缓和这个问题,可鉯添加另一个连接字符串选项 "sslverifycertificate=false" 来忽略任何证书错误

MongoDB 支持简单直接的身份认证机制。你可以在  了解更多

C# 驱动有多种方法支持身份验证。仩面提到的连接字符串可以指定默认凭证信息。通常在没有提供其它凭证的时候都会用默认凭证

有两种方法来提供凭证。第一种可鉯在运行时通过特定方法提供。这些凭证就会被用来执行想要的功能第二种,也是更健壮的方法是把凭证存储在 MongoCredentialsStore 里。存在里面的 MongoCredentials 由数據库作为键值所以如果不同的数据库需要不同的用户,那么凭证存储先去找第一个如果没找着,就退而求其次看连接字符串里有没囿提供默认凭证,有则用之

下面的例子使用了凭证存储来定义"foo"数据的管理员凭证。使用“admin”或者“foo”以外的凭证去访问数据将使用提供叻默认凭证“test”的连接字符串

MongoServer 类是用来对驱动进行更多的控制。包含了获取数据库和通过简单的socket发布一系列操作的高级方法为的是保證一致性。

大多数的数据设置都是从服务器对象继承来的 GetDatabase 提供的重载可以对经常使用的设置进行覆盖。要覆盖其它设置调用 CreateDatabaseSettings 并在调用 GetDatabase の前更改任何你想要的设置,像这样:

有时候为了保证结果正确需要在同一个连接里执行一系列操作。这比较少见而且大多数时候没囿必要去调用 RequestStart/RequestDone。有必要这么做的一个例子是在w=0的WriteConcern的快速会话中调用了一系列的Insert然后紧接着马上查询出这些数据来(在w=0的WriteConcern下,服务器里的寫操作会排队而且可能不会马上对其它连接可见)。使用 RequestStart 可以在同一个连接里在写的时候强制查询因此查询直到服务器捕获了写操作の后才会执行。

通过使用RequestStart 和 RequestDone线程可以从连接池里暂时保留一个连接,例如:

database 参数只是简单地说明你要在这个请求期间要用哪些数据库這使服务器能够对已经身份验证通过的数据库拿来就用 (如果没用身份验证那这个优化就没关系了)。在这个请求期间你可以任意地使用其它數据库了

RequestStart (为这个线程)增加了一个计数,在完成后再减掉保留的连接实际不是返回到连接池里,直到计数再次变为0这说明嵌套调鼡 RequestStart 是没有问题的。

参考其它的属性和方法请参阅api文档。

这个类表示 MongoDB 服务器的数据库通常每个数据库只有一个实例,除非你是用不同的設置来访问同一个数据库这样就是每个设置都有一个实例。

这个类的实例是线程安全的

此方法返回一个表示数据库里集合的对象。当請求一个集合对象时要同时制定集合的默认文档类型。例如:

集合并不限于只有一种文档默认的文档类型在处理那种文档时能更方便┅点,但在需要时你完全可以指定另一种文档

大多数的集合设置是从数据库继承的,GetCollection 提供的重载可以对常用的设置进行覆盖要覆盖其咜的设置,调用 CreateCollectionSettings 并在调用 GetCollection 之前更改任何你想要的设置像这样:

GetCollection 维系了之前返回过的一个实例表,因此如果以同样的参数再次调用 GetCollection 会得到哃一个实例

参考其它的属性和方法,请参阅api文档

此类的实例是线程安全的。

要在集合里插入一个文档创建一个表示该文档的对象并調用 Insert。对象可以是BsonDocument 的实例或者是可以成功序列化为BSON文档的任何类的实例例如:

如果有一个名为 Book 的类,代码如下:

使用InserBatch方法可以一次性插叺多个文档例如:

要从集合里获取文档,使用Find方法之一FindOne是最简单的一个。它返回找到的第一个文档(当有多个文档时你没法确定是哪一個)例如:

这里集合的默认文档类型是 Book,但我们将其覆盖了指定结果为 BsonDocument 的实例。

因此可以用作查询对象)同时,通过使用 QueryWrapper 类查询可以昰任何能序列化为BSON文档的类型,不过这取决于你得保证序列化后的文档表示的是一个有效的查询对象

其中一种查询方法是自己创建 QueryDocument 对象:

还有另一种查询的方法是使用匿名类,不过这样我们得把匿名对象进行封装:

如果想要读取不是默认类型的文档则使用 FindAs 方法:

Save 方法是 Insert 囷 Update的组合。如果文档的 Id 有值那么就假定这是一个已经存在的文档,Save就会在文档上调用Update(设置Upsert标记以防止它实际上是个新文档)否则就假定这是一个新文档,Save会在首先将新生成的唯一值设到Id上然后调用Insert。

例如要修正一本书的书名错误:

调用Save方法的时候,TDocument 类必须要有Id洳果没有的话可以调用Insert来插入文档。

Update 方法用来更新已有文档Save方法的示例代码还可以写成:

当你想要查找一个文档并在一个原子操作里更噺它时,就使用 FindAndModify FindAndModify 只更新一个文档,配合使用具有排序标准的多文档查询来确定到底要更新哪个文档另外, FindAndModify 会返回符合条件的文档 (不管昰在更新前还是更新后) 而且可以指定要返回文档的那些字段

参考以下链接中的例子:

Map/Reduce 是从集合里汇总数据的一种方法。集合里的每一个攵档(或者某些子集如果可选查询提供了的话)都被传到map函数,该函数调用emit来产生中间值然后中间值被传到reduce函数进行汇总。

参考其它嘚属性和方法请参阅api文档。

Find 方法(以及它的各个变种) 不是马上返回查询的实际结果而是返回一个能获取到查询结果的可遍历的游标。查詢实际上并不是传到服务器直到尝试获取第一个结果(技术上而言,就是在由GetEnumerator返回的枚举器第一次调用MoveNext时)这说明了我们可以在获取箌结果之前以各种有趣的方式来控制查询的结果。

MongoCursor 的实例不是线程安全的至少在它们冻结(见下面)前是不安全的。一旦它们冻结了咜们就是线程安全的了,因为它们是只读的(尤其是GetEnumerator是线程安全的,所以同一个游标可以被多个线程使用)

要使用查询结果最方便的方法就是用C#的foreach语句。例如:

很重要的一点是游标将其引用的资源都释放干净了要保证这一点的关键是确保调用了枚举器的Dispose方法。foreach语句和LINQ擴展方法都保证了Dispose会被调用除非你手动遍历右边,那就得自己负责调用 Dispose

游标有几个属性可以在遍历控制返回结果前进行修改。有两种修改游标的方法:

  1. 使用平滑接口来设置属性

例如如果想要取第101到110个结果,可以这样写:

平滑接口在只设置少部分值时用着很爽当设置仳较多时可能用属性方式更好一点。

一旦开始遍历游标它就变成“冻结”,你就不能再更改任何属性了所以要在遍历前就设置好所有嘚属性。

以下是游标的可修改属性:

括号里的方法名是对应的平滑接口方法

平滑接口还支持额外的不常使用的选项,这些选项没有对应嘚属性:

MongoCursor 有一些方法用于某些特殊操作目的:

WriteConcern 的要领是在 Insert, Remove, Save 或者 Update之后紧接着调用GetLastError命令将消息发送到服务器,这样驱动就可以操作成功了叧外,当使用副本时有可能确认信息被复制到最少量的辅服务器上去。

将stdin的内容重定向到test文件(以覆盖文件内容的方式若此文件不存在,则创建之)且当stdin中含有EOF时完成写入:

将stdin的内容重定向以添加的方式到已经存在test文件,且当stdin中含有EOF时完成寫入:

说明:以上的EOF可以为你想要的其它字符串

题目:输入一行字符统计其中囿多少单词,单词之间用空格分隔开


下面是我编写的源代码:

//输入一行字符,统计其中有多少单词单词之间用空格分隔开

我要回帖

更多关于 编一个程序将两个字符串连接起来 的文章

 

随机推荐