Как искать значение ключа в mongodb на основе имени тега в глубоко вложенном документе?
db.props.aggregate([{"$match":{release:"1"}},{"$project":{'_id':0, 'SHK.0':{"$filter":{"input":'$SHK.0.host',"as":'fil', "cond":{$in:['$$fil.Tags',"cd"]}}}}}])
Я использовал выше, чтобы запросить мой набор данных, перечисленных ниже:
{ "_id" : ObjectId("5a0eafdf481fc70d171521b1"),
"release" : "1",
"product" : "1",
"project" : "1",
"patchset" : "1",
"common" : {
"active" : "YES",
"javahome" : "path" },
"SHK" : [
{
"host" : {
"value" : "demo",
"Tags" : [ "ci", "cd" ] },
"appserver" : {
"value" : "demo",
"Tags" : [ "ci" ] },
"appname" : {
"value" : "demo",
"Tags" : [ "cd" ] } } ] }
Но вышеупомянутое, кажется, не работает, я получаю пустой индекс... Я пытаюсь получить здесь конкретную пару значений ключа в соответствии с именем тега, присутствующим, предположим, в вышеупомянутом запросе, поскольку я упомянул cd, я должен получить значение только для хоста и appname и appserver не должны быть перечислены в конечном результате, так как они не содержат тэг cd. Спасибо
1 ответ
Я думаю, вам нужно что-то подобное:
db.props.aggregate([{
"$match": {
release: "1"
}
},
{
$unwind: '$SHK'
},
{
"$project": {
'_id': 0,
'tag': {
"$filter": {
"input": '$SHK.host.Tags',
"as": 'fil',
"cond": {
$in: ['$$fil', ["cd"]]
}
}
}
}
}
])
Вам нужно $unwind
первый массив, в данном случае "SHK". После разматывания (выравнивания) "SHK" единственным массивом является поле "Теги". Итак, вы можете применить $filter
оператор. Также вы пропустили []
в вашем $in
состояние. Вы написали:
{$in:['$$fil.Tags',"cd"]}
но оператор $in строится так:
{ $in: [ <expression>, <array expression> ] }
так что в этом случае:
$in: ['$$fil', ["cd"]]