Удалить несколько документов определенной коллекции, соответствующих критериям в RavenDB - PullRequest
1 голос
/ 08 мая 2019

Я пытаюсь удалить несколько документов определенной коллекции, соответствующих определенным критериям. В идеале после удаления этих документов мне нужно добавить новые документы. Даже если новые документы успешно добавляются в коллекции, при удалении удаляется только один документ. Любая помощь в правильном направлении приветствуется.

Я пробовал разные комбинации async и await, но не работал. Просто чтобы вы знали, я использую один и тот же сеанс для вызовов добавления и удаления. Ниже приведен метод удаления нескольких документов, принимающих сеанс в качестве аргумента.

export async function deleteDocs(session: IDocumentSession, docs: IDoc[]) {
  docs.forEach(doc => {
    session.delete<Doc>(doc);
  });
 await session.saveChanges();
}

Я должен быть в состоянии удалить все документы, соответствующие критериям, а не только один.

1 Ответ

3 голосов
/ 08 мая 2019

DeleteByQueryOperation дает вам возможность удалить большое количество документов одним запросом

Для клиента .Net
Увидеть: https://ravendb.net/docs/article-page/4.1/Csharp/client-api/operations/delete-by-query

Например: Чтобы удалить все документы с сервера, где Имя == Боб, используя индекс Person / ByName, используйте:

var operation = store
    .Operations
    .Send(new DeleteByQueryOperation<Person>("Person/ByName", x => x.Name == "Bob"));

Для Node Client:
(пример взят из тестов)

  it("can delete by query", async () => {
        {
            const session = store.openSession();
            const user1 = Object.assign(new User(), { age: 5 });
            const user2 = Object.assign(new User(), { age: 10 });

            await session.store(user1);
            await session.store(user2);
            await session.saveChanges();
        }

        const indexQuery = new IndexQuery();
        indexQuery.query = "from users where age == 5";
        const operation = new DeleteByQueryOperation(indexQuery);
        const asyncOp = await store.operations.send(operation);

        await asyncOp.waitForCompletion();

        {
            const session = store.openSession();
            const count = await session.query(User).count();
            assert.strictEqual(count, 1);
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...