CosmoDb с Robomongo не могут видеть идентификаторы документов?

Может кто-нибудь сказать мне, почему, когда я использую DataExplorer для CosmoDb DB, я получаю следующее:

{
    "id": "d502b51a-e70a-40f1-9285-3861880b8d90",
    "Version": 1,
    ... 
}

Но когда я использую Robomongo, я получаю:

{
    "Version" : 1,
    ...
}

минус идентификатор?

Спасибо

2 ответа

Я попытался воспроизвести ваш сценарий, но все заработало правильно.

Документ Mongo в Portal Data Explorer:

Визуализация в проводнике данных

Документ Монго в Robo 3T:

Визуализация в Robo 3T

У них обоих есть id имущество.

Применяете ли вы проекции на Robomongo / Robo 3T?

На данный момент cosmodb работает отдельно от SQL API и Mongo API, каждая из которых имеет различную реализацию, SQL API использует JSON, а Mongo использует BSON, вы должны уточнить это при создании документа.

Если вы создадите документ с помощью инструмента на основе BSON, например, Robo3t, вы получите что-то вроде этого:

{
    "_id": {
        "$oid": "5be0d98b9cdcce3c6ce0f6b8"
    },
    "name": "Name",
    "id": "5be0d98b9cdcce3c6ce0f6b8",
    ...
}

Вместо этого, если вы создадите документ с помощью JSON, например, Data Explorer, вы получите следующее:

{
    "name": "Name",
    "id": "6c5c05b4-dfce-32a5-0779-e30821e6c510",
    ...
}

Как видите, для BSON необходимо _id и внутри $oid быть реализованным, чтобы работать правильно, в то время как только на основе JSON id необходимо. Таким образом, вам нужно добавить свойства, пока вы сохраняете документ (см. Ниже) или открываете его с помощью правильного инструмента, как рекомендует Matias Quaranta, используйте Azure Storage Explorer или даже Data Explorer, чтобы правильно получить оба протокола.

Также, если вы используете систему для создания документа и хотите использовать формат BSON, вам нужно добавить $oid, например, в core net что-то вроде этого:

public bool TryGetMemberSerializationInfo(string memberName, out BsonSerializationInfo serializationInfo)
{
    switch (memberName)
    {
        case "Id":
            serializationInfo = new BsonSerializationInfo("_id", new ObjectIdSerializer(), typeof(ObjectId));
            return true;
        case "Name":
            serializationInfo = new BsonSerializationInfo("name", new StringSerializer(), typeof(string));
            return true;
        default:
            serializationInfo = null;
            return false;
    }
}
Другие вопросы по тегам