Mongoose Schema, Set уникально для каждого элемента Array [duplicate]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

0
задан Jeff 4 April 2014 в 04:32
поделиться

1 ответ

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

Пока вы можете быть уверены, что контент, который вы добавление никоим образом не отличается от любого другого значения, то вы можете использовать оператор $addToSet с обновлением:

db.collection.update(
    { "_id": "2013-08-13", "hour": 23 },
    { "$addToSet": { 
        "hours.$.file": {
            "date_added" : ISODate("2014-04-03T18:54:36.671Z"),
            "name" : "1376434800_file_output_2014-03-10-09-27_44.csv"
        }
    }}
)

. Таким образом, этот документ не будет добавлен уже является элементом, соответствующим тем точным значениям в целевом массиве. Если содержимое было другим (и это означает любую часть содержимого, то новый элемент будет добавлен.

Для чего-либо еще вам нужно будет поддерживать это вручную, загрузив документ и проверив элементы (g3) Проблемы с вашей схемой

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

  1. Даты как строки «ужасны». Вы можете подумать, что они вам нужны, но вы этого не сделаете. Подробнее об этом см. в функциях date для агрегирования .
  2. У вас есть вложенные массивы, которых обычно следует избегать. Общие проблемы показаны в документации для оператора positional $ . Это говорит о том, что вы получаете только одно совпадение по позиции и это всегда «верхний» уровень массива.Так что обновление вне добавления вещей, как показано выше, будет затруднительным.

Лучшим шаблоном схемы для вас является просто следующее:

    {
        "date_added" : ISODate("2014-04-03T18:54:36.400Z"),
        "name" : "1376434800_file_output_2014-03-10-09-27_44.csv"
    },
    {
        "date_added" : ISODate("2014-04-03T18:54:36.410Z"),
        "name" : "1376434800_file_output_2014-03-10-09-27_44.csv"
    },
    {
        "date_added" : ISODate("2014-04-03T18:54:36.402Z"),
        "name" : "1376434800_file_output_2014-03-10-09-27_44.csv"
    },
    {
        "date_added" : ISODate("2014-04-03T18:54:36.671Z"),
        "name" : "1376434800_file_output_2014-03-10-09-27_44.csv"
    }

Если это в собственной коллекции, вы всегда можете использовать индексы для обеспечения уникальности. Структура агрегации может разбивать детали и часы даты, когда это необходимо.

Если у вас должно быть это как часть другого документа, попробуйте хотя бы избежать вложенных массивов. Это было бы приемлемо, но не так гибко, как разделение записей:

{
    "_id" : "2013-08-13",
    "hours" : {
        "23": [
            {
                "date_added" : ISODate("2014-04-03T18:54:36.400Z"),
                "name" : "1376434800_file_output_2014-03-10-09-27_44.csv"
            },
            {
                "date_added" : ISODate("2014-04-03T18:54:36.410Z"),
                "name" : "1376434800_file_output_2014-03-10-09-27_44.csv"
            },
            {
                "date_added" : ISODate("2014-04-03T18:54:36.402Z"),
                "name" : "1376434800_file_output_2014-03-10-09-27_44.csv"
            },
            {
                "date_added" : ISODate("2014-04-03T18:54:36.671Z"),
                "name" : "1376434800_file_output_2014-03-10-09-27_44.csv"
            }
        ]
    }
}

. Это зависит от вашего предполагаемого использования, последнее не позволит вам проводить какое-либо сравнение агрегации между часами в течение дня. Не так просто. Первый делает это легко, и вы все равно можете сломать выбор днем ​​и часом с легкостью.

Затем, если вы только добавляете информацию, то ваша существующая схема должна быть найдена. Но имейте в виду возможные проблемы и альтернативы.

1
ответ дан Neil Lunn 18 August 2018 в 23:33
поделиться
  • 1
    Спасибо за вклад в мою схему. Я абсолютно не дба. – Jeff 4 April 2014 в 13:14
  • 2
    Итак, я пытаюсь изменить его так, как вы сказали, но мне нужно знать, в какой час будет представлен файл. – Jeff 4 April 2014 в 13:52
Другие вопросы по тегам:

Похожие вопросы: