2

私は現在、C# ドライバーを使用して MongoDB をいじっており、APIの各メソッドを 1 つずつ試しています (いくつかの例が提供されていれば、はるかに優れています)

そして現在、私はUpdate.PullAll()メソッドに取り組んでいます。

テストにこの POCO オブジェクトを使用しています。

public class Person 
{
    public ObjectId Id { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public List<Skill> Skills { get; set; }
}

public class Skill 
{
    public Object Id { get; set; }
    public string Name { get; set; }
}


設定されている場合、次の json オブジェクトに変換されます。

{
   "_id": ObjectId("4f979621682dbc1a8cefecb3"),
   "Firstname" : "John",
   "Lastname" : "Doe",
   "Skills" : [
       {
          "_id" : ObjectId("4f979621682dbc1a8cefecaf"),
          "Name" : "C#.NET"
       },
       {
          "_id" : ObjectId("4f979621682dbc1a8cefecb0"),
          "Name" : "ASP.NET"
       },
       {
          "_id" : ObjectId("4f979621682dbc1a8cefecb1"),
          "Name" : "SQL Server"
       }
   ]
}

今、スキル コレクションから要素を削除しようとしています。

これが私のコードです:

var server = MongoServer.Create("mongodb://localhost/?safe=true");
var db =  server.GetDatabase("test");
var collection = db.GetCollection<Person>("person");

// Retrieve the data above from  mongoDB
var _person = collection.AsQueryable()
                        .Select(p => p).Single();

// Query to reference "John Doe"
var query = Query.EQ("_id",new ObjectId(_person.Id.ToString()));

// Collection of "John Doe's" skill ids
var objIds = _person.Skills
                    .Select(p => new ObjectId(p.Id.ToString()));

// Parse the skill ids to a BsonArray
var bsonArray = BsonArray.Create(objIds);

var update = Update.PullAll("Skills" , bsonArray);

// Call the Update command
collection.Update( query, update );

これは何もしません。私のjsonオブジェクトはそのまま残ります。

コードのどこが間違っているか指摘してくれる人はいますか?
どんな提案でも大歓迎です、ありがとう。

4

1 に答える 1

3

が機能するには$pullAll、オブジェクト全体を正確に一致させる必要があり、1 つのフィールドだけを使用することはできません (_id と呼ばれていても)。

そのため、更新コマンドに名前も含める必要があります (フィールドも同じ順序にする必要があります)。

実際に使用したいコマンドは です$pull。これは、ここで必要なこと、つまりフィルター条件の一致を行います。

正確な値の一致に加えて、式を使用することもできます ( $pull はこのように特別です)。

「すべてなしでプル」と呼ばれますが、1 つだけでなく、一致したすべての要素をプルします。「all」は、1 つのフィルターがあることを意味します (pullAll には一致する複数の要素があります)。

于 2012-04-25T07:05:51.460 に答える