Я использую javascript и модуль мангуста. У меня есть такой объект
my_object = {
ShopName: String,
employees: [String],
info: {
NameEmployee_1: {
age: String,
work: String,
city: String,
},
NameEmployee_2: {
age: String,
work: String,
city: String,
}
}
}
и я хочу найти всех сотрудников определенного возраста, но не зная имени сотрудника, есть ли способ сделать это?
Я знаю, что вы, например, я могу так что-то вроде этого
db.collection.find({'info.Max': {$exists: true}})
для поиска всех магазинов, в которых есть хотя бы один сотрудник с именем Макс но что, если я хочу, чтобы все магазины имели хотя бы одного сотрудника в возрасте 33 лет?
db.collection.find({'info.<name>.age': '33'})
?
Вы можете использовать $objectToArray (mongoDB 3.4.4 и выше), $фильтр и $project
и получить что-то вроде этого:
db.collection.aggregate([
{
$project: {
obj: {
$objectToArray: "$info"
}
}
},
{
$project: {
_id: 0,
obj: {
$filter: {
input: "$obj",
as: "item",
cond: {
$eq: [
"$$item.v.city",
"NY"
]
}
}
}
}
},
{
$project: {
info: {
$arrayToObject: "$obj"
}
}
},
])
Вы можете это увидеть здесь работают
Идея состоит в том, чтобы разбить объект на массив, отфильтровать его, а затем преобразовать этот массив обратно в объект.
Я отфильтровал city
, но я уверен, что вы поняли идею.
Спасибо. Можете ли вы вернуть идентификатор и новое имя поля и удалить пустую информацию? mongoplayground.net/p/A4bfCeaY6Op