Вставить документ в другой документ в MongoDB

Я пытаюсь добавить документ в другой документ.

введите здесь описание изображения

Я пытаюсь вставить новый документ с меткой времени в качестве ключа и легким прокси и временным содержимым этого документа в документ sensor_collection.

Логично, что мой код не работает, потому что я устанавливаю новый sensor_collection. Кто-нибудь знает, как я могу установить документ с отметкой времени в sensor_collection или не рекомендуется делать это таким образом?

Это код:

MongoCollection<Document> collection  =  db.getCollection(Sensor.KEY_COLLECTION);
    //append sensor data to existing document
    collection.updateOne(doc, new Document("$set",
            new Document("sensor_collection", new Document(
                    String.valueOf(stamp.getCurrentTime()), new Document(
                            Sensor.KEY_LIGHT, sensorData.getLight())
                            .append(Sensor.KEY_PROX, sensorData.getProx())
                            .append(Sensor.KEY_TEMP, sensorData.getTemp())
                    ))));

В настоящее время этот код переопределяет метку времени, которая уже находится в базе данных.


person Manish    schedule 19.12.2015    source источник
comment
Я немного заблудился. вы хотите добавить новый документ к существующему набору?   -  person Ali Dehghani    schedule 19.12.2015
comment
Привет, в sensor_collection я хочу иметь несколько временных меток, каждая из которых содержит light, prox и temp. И я хочу добавить еще один объект временной метки в sensor_collection.   -  person Manish    schedule 19.12.2015


Ответы (2)


Если вы хотите добавить в существующую встроенную коллекцию, используйте $push вместо $set. Оператор $push добавляет указанное значение в массив. Что-то вроде этого:

collection.updateOne(doc, new Document("$push",
            new Document("sensor_collection", new Document(
                    String.valueOf(stamp.getCurrentTime()), new Document(
                            Sensor.KEY_LIGHT, sensorData.getLight())
                            .append(Sensor.KEY_PROX, sensorData.getProx())
                            .append(Sensor.KEY_TEMP, sensorData.getTemp())
                    ))));

Дополнительные сведения об операторах обновления mongo см. здесь

person Ali Dehghani    schedule 19.12.2015
comment
Привет, спасибо за ответ. $ push работает, если sensor_collection был массивом. Это объект. Можно ли добавить еще один объект временной метки в sensor_collection? Без использования массивов. Или использование массивов является более распространенным подходом? - person Manish; 19.12.2015
comment
Вы можете выбрать встроенную коллекцию вместо всей коллекции и просто обновить ее. может быть, это работает, но использовать массив было бы проще, я думаю - person Ali Dehghani; 19.12.2015

В документации Mongodb я нашел это :

«Чтобы указать <field> во встроенном документе или в массиве, используйте точечную нотацию».

Я использовал оператор $ set. И я устанавливаю sensor_collection.timestamp

MongoCollection<Document> collection  =  db.getCollection(Sensor.KEY_COLLECTION);
    //append sensor data to existing document
    collection.updateOne(doc, new Document("$set",
            new Document("sensor_collection."+String.valueOf(stamp.getCurrentTime()),
                     new Document(
                            Sensor.KEY_LIGHT, sensorData.getLight())
                            .append(Sensor.KEY_PROX, sensorData.getProx())
                            .append(Sensor.KEY_TEMP, sensorData.getTemp())
                    )));

Это работает. Дает:

введите здесь описание изображения

person Manish    schedule 19.12.2015