Mongoose Cascade Удалить из массива, содержащего массив идентификаторов [duplicate]

Этот ответ уменьшает стоимость инструкции trycatch.

Я использовал JQuery для разбора строк JSON, и я использовал оператор trycatch для обработки исключений, но бросая исключения для un-parsable строки замедляли мой код, поэтому я использовал простое Regex, чтобы проверить строку, если это возможная строка JSON или нет, не выходя из пера, проверив ее синтаксис, затем я использовал обычный способ, анализируя строку с помощью JQuery:

if (typeof jsonData == 'string') {
    if (! /^[\[|\{](\s|.*|\w)*[\]|\}]$/.test(jsonData)) {
        return jsonData;
    }
}

try {
    jsonData = $.parseJSON(jsonData);
} catch (e) {

}

Я завернул предыдущий код в рекурсивной функции для синтаксического анализа вложенных ответов JSON.

33
задан Nick Parsons 16 January 2013 в 01:39
поделиться

3 ответа

Это один из основных вариантов использования промежуточного программного обеспечения Mongoose 'remove' .

clientSchema.pre('remove', function(next) {
    // 'this' is the client being removed. Provide callbacks here if you want
    // to be notified of the calls' result.
    Sweepstakes.remove({client_id: this._id}).exec();
    Submission.remove({client_id: this._id}).exec();
    next();
});

Таким образом, когда вы вызываете client.remove(), это промежуточное программное обеспечение автоматически вызывается очистить зависимости.

85
ответ дан JohnnyHK 18 August 2018 в 20:13
поделиться
  • 1
    Нет, вы бы назвали это на объекте Schema, который использовался для определения модели Client до создания модели с помощью вызова mongoose.model или db.model. – JohnnyHK 16 January 2013 в 18:34
  • 2
    Работала отлично, когда я переместил ее в файл определения схемы (модель). Однако мне пришлось добавить .exec () в конец вызовов на удаление. В этом нет вреда, верно? – Nick Parsons 16 January 2013 в 19:11
  • 3
    Вы правы, вам нужно сделать это с помощью remove, когда вы не выполняете обратный вызов. Я обновил ответ. – JohnnyHK 16 January 2013 в 19:38
  • 4
    @JohnnyHK: будет ли этот метод вызываться только при вызове client.remove (). В моем приложении я удаляю его, используя следующий оператор: Client.findByIdAndRemove (client_id, function (err) {}) Не будет вызван этот вызов? – inquisitive 22 April 2015 в 11:35
  • 5
    @Inquisitive Правильно, крючок не будет вызываться в этом случае. Он вызывается только при вызове remove в экземпляре doc. – JohnnyHK 22 April 2015 в 12:46

Другим способом я нашел

submissionSchema.pre('remove', function(next) {
    this.model('Client').remove({ submission_ids: this._id }, next);
    next();
});
0
ответ дан Sam Bellerose 18 August 2018 в 20:13
поделиться

Если ваши ссылки хранятся иначе, скажем, client имеет массив из submission_ids, то аналогично принятому ответу вы можете определить следующее на submissionSchema:

submissionSchema.pre('remove', function(next) {
    Client.update(
        { submission_ids : this._id}, 
        { $pull: { submission_ids: this._id } },
        { multi: true })  //if reference exists in multiple documents 
    .exec();
    next();
});

, который удалит идентификатор отправки из ссылочных массивов клиентов в submission.remove().

3
ответ дан Talha Awan 18 August 2018 в 20:13
поделиться
  • 1
    Пожалуйста, не могли бы вы привести пример с помощью OneToMany? Я не прав, если этот код удалит всех дочерних элементов и обновит ссылку и родителя. – Francis Rodrigues 14 February 2018 в 15:55
  • 2
    Не уверен, что я понял ваш комментарий. Но позвольте мне объяснить мой ответ на примере. Скажем, есть 3 клиентских документа: C1, C2, C3. И есть количество документов для представления, один из них - S273. Теперь идентификатор S273 существует в submission_ids для C1 и C3 (OneToMany, то есть у Клиента много представлений). Мой ответ выше описывает сценарий, в котором вы хотите удалить S273. Когда вы это сделаете, идентификатор S273 будет удален из submission_ids как C1, так и C3. – Talha Awan 14 February 2018 в 20:30
  • 3
    Ну .. Я понял, что submissionSchema является дочерней коллекцией, на которую ссылаются Client schema вправо? – Francis Rodrigues 14 February 2018 в 23:12
  • 4
    Да. Это "hasMany" путь. Клиент имеет массив из множества идентификаторов представления. Другой «принадлежит», в котором каждый документ для подачи имеет один идентификатор клиента, к которому он принадлежит. – Talha Awan 15 February 2018 в 13:11
  • 5
    @FrancisRodrigues, потому что он связан с NoSql not Mongoose (который является только библиотекой узлов / оболочкой для mongodb, чтобы облегчить развитие). Я не уверен, что у mongodb есть раздел, чтобы объяснить это, но couchbase (еще один NoSql db) имеет супер-информативные документы, объясняющие это подробно. developer.couchbase.com/documentation/server/4.6/data-modeling/… , developer.couchbase.com/documentation/server/3.x/developer/… , developer.couchbase.com/documentation/server/3.x/developer/… – Talha Awan 16 February 2018 в 13:06
Другие вопросы по тегам:

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