2016-08-03 5 views
2

저는 응용 프로그램을 만들고 MongoDB 컬렉션의 문서 안의 배열에서 요소를 제거하는 기능을 가지고 있습니다.배열의 요소 수를 카운트합니다.

제거 작업 직후에 배열이 비게되는 즉시 배열 필드의 설정을 해제하는 방법이 필요합니다. 비어 있지 않은 배열이있는 문서와 빈 배열이있는 문서를 구별 할 수 있도록이 작업을 수행해야합니다. $가 첫 번째 문서의 teachers 배열에 산화 마그네슘를 사용하여 작업을 당겨,하지만 난 방법을 필요

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" } ] } 

제가 적용했다 : 예를 들어

은, 지금 내 section 컬렉션처럼 보인다 $unset 그것이 비게되면.

현재 Go에서 해결 방법을 만들었지 만 해결 방법없이 문제를 해결하고 싶습니다.

나는 여기서 아주 사소한 것을 놓치지 않기를 바란다.

감사합니다. 먼저 $pull 업데이트 작업을 수행 할 findAndModify() API를 사용하는 것이 좋습니다겠습니까

+0

'$ pull'연산과 함께'teachers' 배열을 하나의 쿼리에서 제거하거나 두 개의 쿼리를 사용 하시겠습니까? – Shrabanee

+0

제거 기능을 수행 한 직후에 제거 작업이 수행 된 특정 섹션 ID의 'teachers'배열이 비어 있는지 확인하려면 'mgo'에 방법이 필요합니다. 아마 배열의 크기를 결정할 때 사용할 수있는'mgo' 함수와, 반환 된 크기가 0 인 경우'$ unset'을 호출 할 수 있습니다 (다시 mgo를 사용). 그러나, 기존의 경우, 다른 좀 더 우아한 해결책도 환영합니다 :) –

답변

1

, 이것은 당신이 다음 확인을위한 교사의 배열에 액세스 할 수 있습니다 수정 된 문서를 반환합니다. 배열 비움 여부를 확인한 후에 배열 키에 요소가없는 경우 교사 필드에서 $unset 연산자를 호출하는 다른 업데이트 작업을 실행할 수 있습니다.

몽고 쉘에서 정식 예는 다음과 같습니다 산화 마그네슘으로이 구현

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 }) 

, 당신은 본질적으로 findAndModify MongoDB의 명령을 감싸는 Query.Apply 방법을 필요

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

빈 배열을 비어와 구별하려면 pty 사용자는 $size 연산자와 함께 find 명령을 사용할 수 있습니다.

빈 배열을 제거하는 경우 수정 된 문서를 원자 적으로 반환 할 수있는 MongoDB findAndModify (자세한 내용은 mgo documentation 참조)과 함께 $ pull 연산자를 사용하여 배열이 비어 있는지 확인하고 다른 쿼리로 설정을 해제 할 수 있습니다.

관련 문제