Краткое описание проблемы - При выполнении фильтра извлечения для вложенного массива объектов с помощью оператора 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 и поднять эту проблему с ними?
Спасибо