Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MongoDB中的BulkWrite操作失败,转义序列无效_C#_Mongodb - Fatal编程技术网

C# MongoDB中的BulkWrite操作失败,转义序列无效

C# MongoDB中的BulkWrite操作失败,转义序列无效,c#,mongodb,C#,Mongodb,我正在运行下面的代码并收到后续错误: 代码: 使用MongoDB.Bson; 使用MongoDB.Driver; 使用System.Collections.Generic; 命名空间MongoBulkWriteSerializationFailure { 班主任 { 公共字符串名; 公共字符串Lastname; } 类DummyClient { 私人收藏(IMongoCollection);; 公共DummyClient() { _集合=(新的MongoClient(“mongodb://roo

我正在运行下面的代码并收到后续错误:

代码:

使用MongoDB.Bson;
使用MongoDB.Driver;
使用System.Collections.Generic;
命名空间MongoBulkWriteSerializationFailure
{
班主任
{
公共字符串名;
公共字符串Lastname;
}
类DummyClient
{
私人收藏(IMongoCollection);;
公共DummyClient()
{
_集合=(新的MongoClient(“mongodb://root:password@localhost:27017/”).GetDatabase(“my_db”).GetCollection(“persons”);
}
公共作废撤销(人)
{
操作列表=新列表();
ReplaceOneModel write_model=new ReplaceOneModel($“{'firstname':{person.firstname}”,“lastname':{person.lastname}}}”,person.ToBsonDocument());
write_model.isupert=true;
列出\u操作的\u。添加(写入\u模型);
BulkWriteResult=_collection.BulkWrite(列出_操作,新的BulkWriteOptions{IsOrdered=false});
System.Console.WriteLine($“已处理{output.ProcessedRequests.Count}项)”;
}
}
班级计划
{
静态void Main(字符串[]参数)
{
DummyClient=new DummyClient();
//成功对照试验:
((新MongoClient)()mongodb://root:password@localhost:27017/),GetDatabase(“my_db”).GetCollection(“persons”).InsertOne((newpersone{Firstname=“John\\1”,Lastname=“Smith”}).ToBsonDocument();
//成功运作:
client.Upsert(新人{Firstname=“Mike”,Lastname=“Smith”});
//操作失败:
client.Upsert(新人{Firstname=“Nick\\1”,Lastname=“Smith”});
}
}
}
错误:

System.FormatException
  HResult=0x80131537
  Message=Invalid escape sequence in JSON string '\1'.
  Source=MongoDB.Bson
  StackTrace:
   at MongoDB.Bson.IO.JsonScanner.GetStringToken(JsonBuffer buffer, Char quoteCharacter)
   at MongoDB.Bson.IO.JsonScanner.GetNextToken(JsonBuffer buffer)
   at MongoDB.Bson.IO.JsonReader.PopToken()
   at MongoDB.Bson.IO.JsonReader.ReadBsonType()
   at MongoDB.Bson.Serialization.Serializers.BsonDocumentSerializer.DeserializeValue(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.Serializers.BsonValueSerializerBase`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
   at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
   at MongoDB.Bson.BsonDocument.Parse(String json)
   at MongoDB.Driver.JsonFilterDefinition`1.Render(IBsonSerializer`1 documentSerializer, IBsonSerializerRegistry serializerRegistry)
   at MongoDB.Driver.MongoCollectionImpl`1.ConvertWriteModelToWriteRequest(WriteModel`1 model, Int32 index)
   at System.Linq.Enumerable.<SelectIterator>d__5`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at MongoDB.Driver.Core.Operations.BulkMixedWriteOperation..ctor(CollectionNamespace collectionNamespace, IEnumerable`1 requests, MessageEncoderSettings messageEncoderSettings)
   at MongoDB.Driver.MongoCollectionImpl`1.CreateBulkWriteOperation(IEnumerable`1 requests, BulkWriteOptions options)
   at MongoDB.Driver.MongoCollectionImpl`1.BulkWrite(IClientSessionHandle session, IEnumerable`1 requests, BulkWriteOptions options, CancellationToken cancellationToken)
   at MongoDB.Driver.MongoCollectionImpl`1.<>c__DisplayClass23_0.<BulkWrite>b__0(IClientSessionHandle session)
   at MongoDB.Driver.MongoCollectionImpl`1.UsingImplicitSession[TResult](Func`2 func, CancellationToken cancellationToken)
   at MongoDB.Driver.MongoCollectionImpl`1.BulkWrite(IEnumerable`1 requests, BulkWriteOptions options, CancellationToken cancellationToken)
   at MongoBulkWriteSerializationFailure.DummyClient.Upsert(Person person) in C:\code\MongoBulkWriteSerializationFailure\Program.cs:line 28
   at MongoBulkWriteSerializationFailure.Program.Main(String[] args) in C:\code\MongoBulkWriteSerializationFailure\Program.cs:line 46
System.FormatException
HResult=0x80131537
Message=JSON字符串“\1”中的转义序列无效。
Source=MongoDB.Bson
堆栈跟踪:
位于MongoDB.Bson.IO.JsonScanner.GetStringToken(JsonBuffer buffer,Char quoteCharacter)
位于MongoDB.Bson.IO.JsonScanner.GetNextToken(JsonBuffer)
在MongoDB.Bson.IO.JsonReader.PopToken()上
在MongoDB.Bson.IO.JsonReader.ReadBsonType()中
位于MongoDB.Bson.Serialization.Serializers.BsonDocumentSerializer.DeserializeValue(BsonDeserializationContext,BsonDeserializationArgs args args)
在MongoDB.Bson.Serialization.Serializers.BSONValueSerializationRBase`1.Deserialize(BsonDeserializationContext,BsonDeserializationArgs args args)
在MongoDB.Bson.Serialization.ibsonSerialization.Deserialize[TValue](IBsonSerializer`1序列化器,BsonDeserializationContext)
位于MongoDB.Bson.BsonDocument.Parse(字符串json)
在MongoDB.Driver.JsonFilterDefinition`1.Render(IBMONSerializer`1 documentSerializer,IBMONSerializerRegistry serializerRegistry)
在MongoDB.Driver.MongoCollectionImpl`1.ConvertWriteModelToWriteRequest(WriteModel`1模型,Int32索引)中
在System.Linq.Enumerable.d_u5`2.MoveNext()中
位于System.Collections.Generic.List`1..ctor(IEnumerable`1集合)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
在MongoDB.Driver.Core.Operations.BulkMixedWriteOperation..ctor(CollectionNamespace CollectionNamespace,IEnumerable`1请求,MessageEncoderSettings MessageEncoderSettings)
在MongoDB.Driver.MongoCollectionImpl`1.CreateBulkWriteOperation(IEnumerable`1请求,BulkWriteOperations选项)
在MongoDB.Driver.MongoCollectionImpl`1.BulkWrite(IClientSessionHandle会话、IEnumerable`1请求、BulkWriteOptions选项、CancellationToken CancellationToken)
在MongoDB.Driver.MongoCollectionImpl`1.c__显示类23_0.b_0(IClientSessionHandle会话)
在MongoDB.Driver.MongoCollectionImpl`1.UsingImplicitSession[TResult](Func`2 Func,CancellationToken CancellationToken)
在MongoDB.Driver.MongoCollectionImpl`1.BulkWrite(IEnumerable`1请求、BulkWriteOptions选项、CancellationToken CancellationToken)
在C:\code\MongoBulkWriteSerializationFailure\Program.cs中的MongoBulkWriteSerializationFailure.DummyClient.upert(Person-Person)处:第28行
在C:\code\MongoBulkWriteSerializationFailure\Program.cs中的MongoBulkWriteSerializationFailure.Program.Main(字符串[]args)处:第46行
需要注意的是,主程序中有一些控制操作,这些操作表明可以在目标数据库中插入数据,以及在
BulkWrite()
操作中包含违规子字符串的数据。我正在测试MongoDB的
4.0.0
版本,并使用官方MongoC#驱动程序的
2.7.0
版本


有人知道我在
BulkWrite()
操作之前准备数据(例如转义)时可能缺少什么吗?准确地说,在“\”之前应用另一对“\”可以解决问题(因此,
Nick\\1
变成了
Nick\\\\1
)。但我有一种感觉,这是有点黑客,因为可能有其他角落的情况,将打破序列化过程。因此,我希望SDK提供的“转义函数”或“包装对象”可以用来解决这些序列化陷阱。

如果您自己在Upsert函数中构建
过滤器定义
像这样:

  public void Upsert(Person person)
    {
        var fiterBuilder = Builders<BsonDocument>.Filter;

        var escapedFirstname = filter_builder.Eq("Firstname", person.Firstname);
        var escapedLastname = filter_builder.Eq("Lastname", person.Lastname);

        var filter = fiterBuilder.And(escapedFirstname, escapedLastname);

        List<WriteModel<BsonDocument>> list_of_operations = new List<WriteModel<BsonDocument>>();
        ReplaceOneModel<BsonDocument> write_model = new ReplaceOneModel<BsonDocument>(filter, person.ToBsonDocument());
        write_model.IsUpsert = true;
        list_of_operations.Add(write_model);
        BulkWriteResult<BsonDocument> outcome = _collection.BulkWrite(list_of_operations, new BulkWriteOptions { IsOrdered = false });
        System.Console.WriteLine($"Processed {outcome.ProcessedRequests.Count} item(s)");
    }
public void Upsert(个人)
{
var fiterBuilder=Builders.Filter;
var escapedFirstname=filter_builder.Eq(“Firstname”,person.Firstname);
var escapedLastname=filter\u builder.Eq(“Lastname”,person.Lastname);
var filter=fiterBuilder.And(escapedFirstname,escapedLastname);
操作列表=新列表();
ReplaceOneModel write_model=新的ReplaceOneModel(过滤器,person.ToBsonDocument());
write_model.isupert=true;
列出\u操作的\u。添加(写入\u模型);
BulkWriteResult结果=_集合.BulkWrite(列出_操作,新的BulkWriteOptions{IsOrdered=false
  public void Upsert(Person person)
    {
        var fiterBuilder = Builders<BsonDocument>.Filter;

        var escapedFirstname = filter_builder.Eq("Firstname", person.Firstname);
        var escapedLastname = filter_builder.Eq("Lastname", person.Lastname);

        var filter = fiterBuilder.And(escapedFirstname, escapedLastname);

        List<WriteModel<BsonDocument>> list_of_operations = new List<WriteModel<BsonDocument>>();
        ReplaceOneModel<BsonDocument> write_model = new ReplaceOneModel<BsonDocument>(filter, person.ToBsonDocument());
        write_model.IsUpsert = true;
        list_of_operations.Add(write_model);
        BulkWriteResult<BsonDocument> outcome = _collection.BulkWrite(list_of_operations, new BulkWriteOptions { IsOrdered = false });
        System.Console.WriteLine($"Processed {outcome.ProcessedRequests.Count} item(s)");
    }