2016-02-21 6 views
1

Я пытаюсь использовать upsert особенность MongoDB v3.2 с использованием Java, поэтому каждое решение не включая ответа Java не будет принят.Upsert вложенные объекты в MongoDB 3.2 с помощью драйвера Java

Моя проблема заключается в том, что upsert команда переопределения вложенные объекты вместо добавления новых, я попытался использовать «$ addToSet» и «толчок», но без успеха, и я получаю сообщение об ошибке, указывающее, что не поддерживает эту команду.

Я хочу обновить документ клиента, а также их внутренние объекты, такие как значения чеков и чеков. глобальная структура клиентского документа приведена ниже.

 
Client 
| 
|__Checks // array of checks , update or insert operation 
    | 
    |__values // array of values, every check has its own values (20 max) 
       // update using index(id) 

звено: Example's source code

Мое намерение состоит в том, чтобы использовать только один запрос для обновления документа клиента без использования много запросов.

Я не специалист по mongodb, поэтому все советы или критики будут оценены.

Даже если я делаю это все не так, не стесняйтесь сообщать мне, и, пожалуйста, используя Java для Монго 3,2.

enter image description here

enter image description here

enter image description here

Вот исходный код, используемый для создания последнего результата.

package org.egale.core; 

import com.mongodb.MongoClient; 
import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoDatabase; 
import com.mongodb.client.model.UpdateOptions; 
import java.util.ArrayList; 
import java.util.List; 
import org.bson.Document; 

/** 
* 
* @author Zied 
*/ 
public class MongoTest { 

    /** 
    * Pojo used to populate data 
    */ 
    static class CheckModel { 
     public String client; 
     public String checkId; 
     public String name; 
     public String command; 
     public String description; 
     public String topic; 
     public int refresh = 60; 
     public int status; 
     public String output; 
    } 

    static MongoClient mongoClient = new MongoClient(); 
    static String dbName = "eagle"; 

    private static List<Document> getCheckValues(CheckModel checkModel, int index) { 

     final List<Document> checkValues = new ArrayList<>(); 
     final Document val = new Document() 
       .append("id", index) 
       .append("output", checkModel.output) 
       .append("status", checkModel.status); 
     checkValues.add(val); // second execution should not ovveride the content of value but a new 
     return checkValues; 
    } 

    private static void insertCheck(MongoDatabase db, CheckModel checkModel) { 
     int idx =++index % 20; 
     final List<Document> checks = new ArrayList<>(); 
     final Document check = new Document() 
       .append("name", checkModel.name) 
       .append("command", checkModel.command) 
       .append("id", checkModel.checkId) 
       .append("description", checkModel.description) 
       .append("topic", checkModel.topic) 
       .append("last_output", checkModel.output) 
       .append("index", index) 
       .append("last_status", checkModel.status) 
       .append("values", getCheckValues(checkModel,idx)) 
       .append("refresh", checkModel.refresh); 
     checks.add(check); 

     Document client = new Document() 
       .append("name", checkModel.client) 
       .append("checks", checks); 
     //.append("$addToSet" , new Document("checks", checks)); // <<- error here '$addToSet' is not recocnized 

     db.getCollection("clients") // execute client insert or update 
       .updateOne(
         new Document().append("_id", checkModel.client), new Document("$set", client), new UpdateOptions().upsert(true) 
       ); 
    } 

    static int index = 0; 

    // Name of the topic from which we will receive messages from = " testt" 
    public static void main(String[] args) { 
     MongoDatabase db = mongoClient.getDatabase(dbName); 

     CheckModel checkModel = new CheckModel(); 
     checkModel.command = "ls -lA"; 
     checkModel.client = "client_001"; 
     checkModel.description = "ls -l command"; 
     checkModel.checkId = "lsl_command"; 
     checkModel.name = "client 001"; 
     checkModel.output = "result of ls -l"; 
     checkModel.status = 0; 
     checkModel.topic = "basic_checks"; 
     checkModel.refresh = 5000; 

     initDB(db); 
     // insert the first check 
     insertCheck(db, checkModel); 
     // insert the second check after some modification 
//  insertCheck(db, modifyData(checkModel)); 

    } 
    // mdofiy data to test the check 
    private static CheckModel modifyData(CheckModel checkModel){ 
     checkModel.status = 1; 
     checkModel.output = "ls commadn not found"; 
     return checkModel; 
    } 
    private static void initDB(MongoDatabase db) { 
     MongoCollection<Document> collection = db.getCollection("configuration"); 
     if (collection.count() == 0) { 
      Document b = new Document() 
        .append("_id", "app_config") 
        .append("historical_data", 20) 
        .append("current_index", 0); 
      collection.insertOne(b); 
     } 

     Document b = new Document().append("none", "none"); 

     MongoCollection<Document> clients = db.getCollection("clients"); 
     clients.insertOne(b); 
     clients.deleteOne(b); 

     MongoCollection<Document> topics = db.getCollection("topics"); 
     topics.insertOne(b); 
     topics.deleteOne(b); 
    } 

} 

ответ

-1

Вы можете использовать $ толчка, $ каждый, $ кусочка, чтобы решить вашу проблему, см Alse https://docs.mongodb.org/manual/reference/operator/update/slice/.

db.students имеет следующие документы

{ "_id" : 10, "scores" : [ 1, 2, 3 ] } 

db.students.update(
    { _id: 10 }, 
    { 
    $push: { 
     scores: { 
     $each: [ 4 ], 
     $slice: -3 
    } 
    } 
} 
) 

результат:

{ "_id" : 10, "scores" : [ 2, 3, 4] } 
+0

спасибо за ваш ответ, но это не то, что я ищу ??.! –

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