2016-03-24 23 views
0

可以說我有一個對象,該對象僅包含一個數組c。與位置運算符#MongoDB的UPSERT發出

public class A 
{ 
     [BsonId] 
     public ObjectId Id; 
     public int[] arr; 

     public A() 
     { 
      arr = new [5]; 
     } 

} 

當我想以更新標識陣列中的某些指標,

和ID couldn不會被發現我想插入新的對象到數據庫,並且當它被插入時

它假設有這個提供的Id和一個帶有所提供索引值的arr。

到目前爲止好,但是,它不會發生。

//receiving ObjectId id, int input_index, int input_value 

var filter = Builders<A>.Filter.Eq(x => x.Id, id); 
var options = new UpdateOptions() 
{ 
    IsUpsert = true 
}; 
var update = Builders<A>.Update.Set(x => x.arr[input_index], input_value); 

//executing the query.... 

相反,Id被插入行,但該陣列是變而不是數組與所提供的值的一個int值。

這是一個已知的錯誤嗎?反正有嗎?

TIA

Refrence對老年人的問題,但它是2年前: here

編輯

即時通訊註冊默認丘壑的ARR:

if (!BsonClassMap.IsClassMapRegistered(typeof (A))) 
      { 
       BsonClassMap.RegisterClassMap<A>(map => 
       { 
        map.AutoMap(); 
        map.SetIgnoreExtraElements(true); 
        map.GetMemberMap(c => c.arr) 
         .SetDefaultValue(new int[5] {0, 0, 0, 0, 0}); 
       }); 
      } 

也試過添加標籤而不是registerMap:

[BsonDefaultValue(new int[5] {0, 0, 0, 0, 0})] 
[BsonIgnoreIfDefault] 
public int[] arr {set;get;} 

和Im接收:

反序列化 類DatabaseManager.MongoEntities.A的ARR屬性時發生錯誤:無法反序列化 'INT []' 從 BsonType '文檔'。

+0

我假設如果數組中沒有5個元素,那麼只有那些存在的元素被填充,並且忽略任何多餘元素? – BanksySan

回答

1

根據您的查詢,它存儲爲整數而不是數組可能無關緊要。

考慮與集合:

/* 1 */ 
{ 
    "_id" : ObjectId("56faeabd4e7309356aa1a0ba"), 
    "arr" : [ 
     1, 
     2, 
     3 
    ] 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("56faeac74e7309356aa1a0bb"), 
    "arr" : 2 
} 

包含類型查詢仍然如預期,例如:

db.collection.find({arr: 2}) 

仍返回這兩個文件。

會出現的問題是您想要執行其他陣列更新,如$push$pop等或$size

串行器

下面是一個自定義反序列化到你的類型的例子。

using MongoDB.Bson; 
using MongoDB.Bson.Serialization; 
using MongoDB.Bson.Serialization.Serializers; 
using MongoDB.Driver; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     BsonSerializer.RegisterSerializer(new MySerializer()); 

     var client = new MongoClient(); 
     var database = client.GetDatabase("test"); 
     var collection = database.GetCollection<A>("upsertArray"); 

     var docs = collection.Find(new BsonDocument()).ToList(); 
    } 
} 

class A 
{ 
    public int[] Arr { get; set; } 
    public ObjectId Id { get; set; } 
} 

class MySerializer : SerializerBase<A> 
{ 
    public override A Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) 
    { 
     var doc = BsonDocumentSerializer.Instance.Deserialize(context); 

     var ints = new int[5]; 

     var arr = doc["arr"]; 

     if (arr.IsBsonArray) 
     { 
      var array = arr.AsBsonArray; 

      for (var i = 0; i < 5; i++) 
      { 
       if (i < array.Count) 
       { 
        ints[i] = array[i].AsInt32; 
       } 
       else 
       { 
        break; 
       } 
      } 
     } 
     else 
     { 
      ints[0] = arr.AsInt32; 
     } 

     return new A { Arr = ints, Id = doc["_id"].AsObjectId }; 
    } 
} 
+0

它是有問題的,因爲它不能將文檔轉換爲實際的類型,在這個例子中:A –

+0

@OriRefael啊...是的,你需要一個自定義的序列化程序。 – BanksySan

+0

@OriRefael爲自定義解串器添加代碼。這是你想到的行爲嗎? – BanksySan