2016-08-03 15 views
2

私はアプリケーションを作成しており、MongoDBコレクション内のドキュメント内の配列から要素を削除する関数を持っています。配列の要素数をカウントする

削除操作の直後に配列が空になるとすぐに、配列のフィールドの設定を解除する方法が必要です。空ではない配列を持つドキュメントと空の配列を持つドキュメントを区別できるように、これを行う必要があります。

例えば、今の私のsectionコレクションは次のようになります。

db.section.find({}) 

{ "_id" : ObjectId("57a0a38ad1c6ef24376477c5"), "sectionid" : "BTE4B", 
"sectionname" : "BTech 4B", "year" : 4, 
"session" : 2016, "courseid" : "BTE-CS", "password" : "pm8xTE0-", 
"students" : 35, "addedon" : "2016-08-02 19:13:38", "teachers" : [ ] } 

{ "_id" : ObjectId("57a0a96bd1c6ef24376477cd"), "sectionid" : "BTE4D", 
"sectionname" : "BTech 4D", "year" : 4, "session" : 2016, "courseid" : 
"BTE-CS", "password" : "sHhKr0Ov", "students" : 41, "addedon" : 
"2016-08-02 19:38:43", "teachers" : [ { "facultyid" : "CS-102", 
"subjectid" : "CS-ALGO" } ] } 

私は$最初の文書のteachersアレイ上のMgOを使用して操作を引くが、私はへの道を必要とする適用していました$unsetそれが空になるとき。

現在、私はGoで回避策を作成していますが、回避策なしで逃げたいと思います。

私はここで何か非常に些細なことを逃していないことを願っています。

ありがとうございます!最初$pull更新操作を行うためにfindAndModify() APIを使用することをお勧めし

+0

'$ pull'演算と一緒に' teachers'配列を1つのクエリで削除するか、2つのクエリを使用したいですか? – Shrabanee

+0

削除機能の直後に、削除操作が実行された特定のセクションIDの 'teachers'配列が空であるかどうかを調べるには' mgo'の方法が必要です。多分 'mgo'が提供する関数ですが、配列のサイズを調べるために使うことができ、返されるサイズが0の場合は' $ unset'を呼び出すことができます(もう一度、mgoを使用します)。しかし、既存の場合、他のよりエレガントなソリューションも歓迎です:) –

答えて

1

が、これはあなたがチェックするための教師のアレイにアクセスすることができます変更された文書を返します。配列の空をチェックしたら、配列キーに要素がない場合は、$unset演算子をteachersフィールドで呼び出す別の更新操作を発行できます。

のmongoシェルで標準的な例は、以下:

のMgOでこれを実装する
change = db.section.findAndModify({ 
    query: { "sectionid": "BTE4D", "teachers.facultyid": "CS-102" }, 
    update: { "$pull": { "teachers": { "facultyid" : "CS-102" } } }, 
    new: true 
}); 

printjson(change); 

if (!change.teachers[0]) { 
    db.section.update(
     { "_id": change._id }, 
     { "$unset": { "teachers": "" } } 
    ); 
} 

db.section.find({ "_id": change._id }) 

、あなたは本質的

change := mgo.Change{ 
     Update: bson.M{"$pull": bson.M{"teachers": bson.M{"facultyid": "CS-102"}}}, 
     ReturnNew: true, 
} 
info, err = col.Find(M{"sectionid": "BTE4D"}).Apply(change, &doc) 
fmt.Println(doc.N) 
+1

ありがとう、これは私が探していたものです。 –

1
findAndModify MongoDBのコマンドをラップ Query.Apply方法が必要になります

空アレイを非emと区別するにはptyでは、$size演算子でfindコマンドを使用できます。

空の配列を削除する場合は、変更されたドキュメントをアトミックに返すことができるMongoDB findAndModify(mgo documentationを参照)で$ pull演算子を発行して、配列が空であるかどうかをチェックし、

関連する問題