#mongodb #mongodb-query
#mongodb #mongodb-запрос
Вопрос:
Я использую MongoDB, и у меня есть следующая коллекция:
>>> db.inventory.insertMany( [
{ item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
{ item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] }
]);
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5ff767c63484d0e87c8fdb6c"),
ObjectId("5ff767c63484d0e87c8fdb6d")
]
}
Я знаю, что могу запросить вложенные объекты в instock
массиве и получить соответствующие документы. Например.:
>>> db.inventory.find( { 'instock.qty': { $lte: 10 } } );
{
"_id" : ObjectId("5ff767c63484d0e87c8fdb6c"),
"item" : "journal",
"instock" : [ { "warehouse" : "A", "qty" : 5.0 }, { "warehouse" : "C", "qty" : 15.0 } ]
}
{
"_id" : ObjectId("5ff767c63484d0e87c8fdb6d"),
"item" : "notebook",
"instock" : [ { "warehouse" : "C", "qty" : 5.0 } ]
}
Но теперь я хотел бы дублировать возвращенные документы, если find
условие соответствует документу несколько раз. Что-то вроде:
>>> db.inventory.find( { 'instock.qty': { $lte: 20 } } );
{
"_id" : ObjectId("5ff767c63484d0e87c8fdb6c"),
"item" : "journal",
"instock" : [ { "warehouse" : "A", "qty" : 5.0 }, { "warehouse" : "C", "qty" : 15.0 } ]
}
{
"_id" : ObjectId("5ff767c63484d0e87c8fdb6c"),
"item" : "journal",
"instock" : [ { "warehouse" : "A", "qty" : 5.0 }, { "warehouse" : "C", "qty" : 15.0 } ]
}
{
"_id" : ObjectId("5ff767c63484d0e87c8fdb6d"),
"item" : "notebook",
"instock" : [ { "warehouse" : "C", "qty" : 5.0 } ]
}
В этом примере первый документ возвращается дважды, потому { 'instock.qty': { $lte: 20 } }
что условие совпадает с документом дважды (для { "warehouse" : "A", "qty" : 5.0 }
и также { "warehouse" : "C", "qty" : 15.0 }
)
Есть ли способ добиться такого поведения с MongoDB?
Спасибо.
Комментарии:
1. Зачем использовать сетевой трафик и использовать базу данных вместо дублирования документов на стороне клиента? У вас есть все данные, необходимые для этого
2. @SergeyBerezovskiy Для того, чтобы использовать функцию разбиения Mongo на страницы (пропустить, ограничить) для дублированных результатов.
3. Решает ли этот подход для вас? mongoplayground.net/p/btUCYw6F5ap
4. Или, может быть, вам нужно это: mongoplayground.net/p/EO4bsxfXmbu