C# MongoDB Azure Космос Pull Filter - PullRequest
0 голосов
/ 29 марта 2020

Краткое описание проблемы - При выполнении фильтра извлечения для вложенного массива объектов с помощью оператора Lt Azure Cosmos Mon go API не удаляет ожидаемые элементы.

. NET Версия -. NET Core 3.1

MongoDB.Driver Version - 2.10.2

Здесь приведены подробные сведения о том, что Я пытаюсь сделать и что происходит.

У меня есть следующий документ

{
    "_id" : ObjectId("5e80b59326773581903da606"),
    "item" : "journal",
    "instock" : [
        {
            "warehouse" : "A",
            "qty" : 15
        },
        {
            "warehouse" : "B",
            "qty" : 5
        },
        {
            "warehouse" : "C",
            "qty" : 2
        }
    ]
}

Что я хочу сделать, это удалить все элементы из массива "instock", где qty меньше, чем 10. Вот мой C# код, использующий пакет nuget MongoDB.Driver, в котором я пытаюсь это сделать.

static void Main(string[] args)
{
    var item = "journal";
    var collection = GetCosmosCollection();
    collection.DeleteOne(i => i.item == item); // Delete the existing document
    InsertSampleData(collection, item); // Insert the sample JSON document shown above

    var filter = Builders<InventoryItem>.Filter.Eq("item", item);

    // Remove from the instock array where qty is less than 10
    var stockPullFilter = Builders<InventoryItem>.Update.PullFilter(
        "instock", 
        Builders<Stock>.Filter.Lt(s => s.qty, 10)
    );

    collection.FindOneAndUpdate<InventoryItem>(
        filter, 
        stockPullFilter
    );
}

Когда я go просматриваю коллекцию в проводнике данных Azure Cosmos, я до сих пор видны все объекты, перечисленные в «instock».

Если я поменяю оператор на «Eq» вместо «Lt» и сопоставлю точное количество, то это сработает.

// Remove from the instock array where qty equals 5
var stockPullFilter = Builders<InventoryItem>.Update.PullFilter(
    "instock", 
    Builders<Stock>.Filter.Eq(s => s.qty, 5)
);

Так что мне кажется, что это ошибка с использованием оператора Lt. Я попробовал с Lte, Gt и Gte и столкнулся с той же проблемой.

Затем я решил раскрутить коллекцию, используя Mon go Atlas, и посмотреть, что произошло. Точно такой же код C# работает с Atlas с использованием оператора Lt. Так что на данный момент, похоже, проблема с Космосом.

Далее я воссоздал эту логику c, просто используя команды оболочки mon go, чтобы выяснить, если это проблема с драйвером mon go. net или с Cosmos.

// Delete the test item to make sure we start fresh
db.inventory.deleteOne( { "item": "journal" } )

// Insert a test item, with 3 instock elements
db.inventory.insertOne( { "item": "journal", "instock": [{warehouse: "A", qty: 15}, {warehouse: "B", qty: 5}, {warehouse: "C", qty: 2}] } );

// Find the test item to confirm it insert successfully
db.inventory.find( { "item": "journal" } ).pretty()

// Pull (remove) from the instock array where the quantity is less than 10
db.inventory.update({ item: "journal" }, { $pull: { instock: { qty: { $lt: 10 } } } }, { multi: true })

// Find the test item to confirm the stock is removed as expected
db.inventory.find( { "item": "journal" } ).pretty()

Выполнение этого для Atlas работает нормально, в то время как выполнение этого для Cosmos не приводит к удалению каких-либо элементов.

Очевидно, что это проблема с реализацией Azure Cosmos Mon go API, но у меня такой вопрос:

Есть ли другой способ написать эту команду извлечения или мне нужно обратиться в службу поддержки Microsoft и поднять эту проблему с ними?

Спасибо

1 Ответ

0 голосов
/ 01 апреля 2020

Похоже, это ошибка в нашем сервере версии 3.2, которая была исправлена ​​в 3.6. Если вы хотите перейти на версию 3.6, вы можете либо создать новую учетную запись Cosmos и выбрать 3.6, либо подать заявку в службу поддержки, и мы выполним обновление на месте. Спасибо.

...