Пн goose, $ вытащить элемент из вложенного массива и обновить документ в зависимости от наличия элемента - PullRequest
0 голосов
/ 11 июля 2020

Я работаю над схемой mon goose, подобной этой:

const actionSchema = {
    actions: {
        type: [{
            actionName: {
                type: String,
                required: true
            },
            count: {
                type: Number,
                default: 0,
                required: true
            },
            users: [{
                type: Schema.Types.ObjectId,
                ref: 'User'
            }]
        }]
    }};

Это вложенная схема схемы поста. Здесь действия генерируются динамически, и количество людей, выполняющих это действие, поддерживается с помощью count, а их идентичность поддерживается массивом users.

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

Совершенно новый для mon goose и mongodb, один простой способ я see - найти сообщение, используя Post.findById(), который необходимо обновить, запустить цикл js, обновить сообщение и вызвать .save(). Но это может быть очень дорогостоящим, если в массиве пользователей есть тысячи идентификаторов пользователей. Я попробовал .update(), но не могу понять, как его использовать в этом случае.

Как насчет добавления метода в модель сообщения (например, postSchema.methods.removeUserAction)? Это дает доступ к документу из this и позволяет обновить документ и, таким образом, вызвать .save(). Загружает ли он полный документ в приложение клиентского узла?

Пожалуйста, предложите правильный путь. Спасибо.

1 Ответ

1 голос
/ 11 июля 2020

Вам следует упростить вашу модель, например

// Model - Actions Model

const actionSchema = {
   actionName: {
       type: String,
       required: true
   },
   user: {
       type: Schema.Types.ObjectId,
       ref: 'User'
   }
};

И вы можете легко получить общее количество действий с помощью Model.count(), получить конкретное c количество действий с помощью Model.count({ actionName: 'action name'}) и удалить записи с помощью Model.delete(condition). Если только нет причины, по которой вы так смоделировали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...