2013-11-20 5 views
2

У меня есть массив поддокумента в документе mongodb.
Я хочу отсортировать эти поддокументы. Я нашел, что можно сортировать при обновлении массива.
link: http://docs.mongodb.org/manual/reference/operator/update/sort/Сортировка массива поддокументов в mongodb с java

Я хочу сделать это в java. Вот часть моего кода:

BasicDBObject each = new BasicDBObject("$each", input); 
BasicDBObject operations = each.append("$slice", "-10").append("$sort", new BasicDBObject("order",1)); 
push = new BasicDBObject("$push", new BasicDBObject("datas", operations)); 
collection.update(query, push); 

Но оказывается, что это не получилось «операции» с операторами, а непосредственно толкать их в документы и сделал «$ каждый», «$ ломоть» и «$ сортировать "как поля. Где я ошибался?

ответ

4

Я применил java-версию запроса, указанную в приведенном выше link.

Запрос является:

db.students.update({ name: "joe" }, 
        { $push: { quizzes: { $each: [ { id: 3, score: 8 }, 
                { id: 4, score: 7 }, 
                { id: 5, score: 6 } ], 
              $sort: { score: 1 }, 
              $slice: -5 
             } 
          } 
        } 
       ) 

Использование Java Драйвер можно реализовать следующим образом:

DBCollection coll = db.getCollection("students"); 

DBObject query = new BasicDBObject("name", "joe"); 

DBObject dbObj1 = new BasicDBObject(); 
dbObj1.put("id", 3); 
dbObj1.put("score", 8); 

DBObject dbObj2 = new BasicDBObject(); 
dbObj2.put("id", 4); 
dbObj2.put("score", 7); 

DBObject dbObj3 = new BasicDBObject(); 
dbObj3.put("id", 5); 
dbObj3.put("score", 6); 

BasicDBList eachList = new BasicDBList(); 
eachList.add(dbObj1); 
eachList.add(dbObj2); 
eachList.add(dbObj3); 

BasicDBObject quizzesObj = new BasicDBObject(); 
quizzesObj.put("$each", eachList); 
quizzesObj.put("$sort", new BasicDBObject("score", 1)); 
quizzesObj.put("$slice", -5); 

coll.update(query, new BasicDBObject("$push", new BasicDBObject("quizzes", quizzesObj))); 
+0

Хорошо, я пропустил часть BasicDBList. Благодаря! – user3003675