Хранимая процедура Cosmos DB не выполнялась без PartitionKey

У меня есть коллекция, в которой есть PartitionKey. Я создал хранимую процедуру, которая принимает запрос в качестве параметра. в этой хранимой процедуре я извлекаю некоторые документы для обновления, но при извлечении появляется сообщение об ошибке, говорящее о предоставлении PartitionKey, когда я использую метод

public Task<StoredProcedureResponse<TValue>> ExecuteStoredProcedureAsync<TValue>(Uri storedProcedureUri, [Dynamic(new[] { false, true })] params dynamic[] procedureParams);

при использовании другого метода

public Task<StoredProcedureResponse<TValue>> ExecuteStoredProcedureAsync<TValue>(string storedProcedureLink, RequestOptions options, [Dynamic(new[] { false, true })] params dynamic[] procedureParams);

в этом методе я передаю PartitionKey как

new RequestOptions { PartitionKey = new PartitionKey(Undefined.Value)

при использовании этого RequestOptions в хранимой процедуре документ не является Fetch.

function ABC(query) {
var collection = getContext().getCollection();
var collectionLink = collection.getSelfLink();
var response = getContext().getResponse();
// Validate input.
if (!query) throw new Error("The query is undefined or null.");

tryQueryAndDelete();

function tryQueryAndDelete(continuation) {
    var requestOptions = { continuation: continuation };

    var isAccepted = collection.queryDocuments(collectionLink, query, requestOptions, function (err, retrievedDocs, responseOptions) {
        if (err) throw err;

        if (retrievedDocs.length > 0) {
           console.info("Doc Found");
        } else {
           console.info("Doc not Found");

        }
    });
}

}

есть ли способ получить документы без передачи PartitionKey?

Привет, есть обновления?

Jay Gong 30.04.2018 03:34

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

Satyaray Singh 30.04.2018 10:12

Большой! Вы можете отметить ответ для справки других. Спасибо

Jay Gong 30.04.2018 10:16
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
1
3
1 754
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

If the collection the stored procedure is registered against is a single-partition collection, then the transaction is scoped to all the documents within the collection. If the collection is partitioned, then stored procedures are executed in the transaction scope of a single partition key. Each stored procedure execution must then include a partition key value corresponding to the scope the transaction must run under.

Вы можете обратиться к описанию выше, в котором упоминается здесь.

Невозможно избежать вышеуказанного правила, установив ключ раздела на Undefined.Value. Вы должны предоставить ключ раздела при выполнении хранимой процедуры в многораздельной коллекции.

is there anyway so that I can fetch the documents without passing the PartitionKey?

Вы можете установить EnableCrossPartitionQuery на true в параметре FeedOptions при выполнении запроса sql. (Имеет узкое место в производительности).

Надеюсь, это поможет тебе.

не нашел переопределенного метода для ExecuteStoredProcedureAsync, который принимает FeedOptions. мне нужно передать EnableCrossPartitionQuery значение true в requestOptions хранимой процедуры? @jay Gong

Satyaray Singh 27.04.2018 07:14

@SatyaraySingh нет, EnableCrossPartitionQuery - это одно из свойств в FeedOptions, а не RequestOptions. Итак, вы все равно должны предоставить ключ раздела для выполнения хранимой процедуры.

Jay Gong 27.04.2018 07:29

в классе DocumentClient есть 4 метода переопределения ExecuteStoredProcedureAsync для выполнения хранимой процедуры, но ни у одного из них нет FeedOptions в качестве параметров. это просто означает, что я не могу сделать это в магазине? @jay Gong

Satyaray Singh 27.04.2018 07:55

@SatyaraySingh Да. у вас нет способов получить ключ раздела?

Jay Gong 27.04.2018 08:04

Все документы, которые я пытаюсь получить, имеют другой ключ раздела. Я думаю, мне нужно получить весь документ в коде, а затем обновить его, после чего я сохраню его индивидуально. @jay Gong

Satyaray Singh 27.04.2018 08:22

@SatyaraySingh Давай поговорим в этом чате: chat.stackoverflow.com/rooms/169914/jay-satyaray-singh

Jay Gong 27.04.2018 08:30

@SatyaraySingh Извините за сообщение о задержке, пожалуйста, проверьте чат еще раз .Thx.

Jay Gong 27.04.2018 10:03

@JayGong есть ли способ создать неразмеченную коллекцию? и, кстати, ссылка больше не действительна :(

fascynacja 01.04.2020 08:54

@fascynacja Несомненно, вам нужно создавать неразмеченную коллекцию с помощью sdk, а не на портале. Я только что искал, но не могу найти ни одного утверждения в теге создания cosmos db на портале. Я помню, что там есть предложение для вас. В любом случае, сделайте это в sdk. Не устанавливайте ключ раздела при создании коллекции в sdk.

Jay Gong 01.04.2020 08:58

Другие вопросы по теме