2016-08-03 2 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 массиве первого документа, но мне нужен способ $unset это когда будет пусто.

В настоящее время мне удалось создать обходной путь в Go, но мне бы хотелось уйти без каких-либо обходных решений.

Надеюсь, что здесь нет ничего тривиального.

Спасибо!

+0

Вы хотите удалить массив 'teachers' вместе с операцией' $ pull' в одном запросе или используя два запроса? – Shrabanee

+0

Мне нужно найти способ «mgo», чтобы узнать, что сразу после функции удаления массив 'учителей этого конкретного раздела (на котором выполнялась операция удаления) пуст или нет. Может быть, функция, которую предоставляет 'mgo', которую я могу использовать для определения размера массива, и если возвращаемый размер равен 0, я могу вызвать' $ unset' (еще раз, используя mgo). Но, если уже существует, другое более элегантное решение тоже приветствуется :) –

ответ

1

предположить, используя findAndModify() API, чтобы сделать операцию обновления на $pull первой, это возвращает измененный документ, который вы можете получить доступ к массиву учителей для проверки. После проверки пустоты массива вы можете затем выполнить другую операцию обновления, которая вызывает оператор $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 }) 

Реализация этого с МдО, вам нужен метод Query.Apply, который по существу оборачивает команду findAndModify MongoDB

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

Чтобы отличить пустые массивы от не-em pty вы можете использовать команду find с оператором $size.

Если вы решили удалить пустые массивы можно выдать $ нагрузочного оператора с MongoDB findAndModify (см ЕГО documentation для более подробной информации), которые могут атомарно вернуть измененный документ, проверить, если массив пуст и не установлен его с другим запросом.

Смежные вопросы