Запрос Mongodb для тройного вложенного массива объекта - PullRequest
0 голосов
/ 29 июня 2019

У меня возникла проблема при написании запроса для возврата тройного вложенного значения из документа.Документы, которые я использую, структурированы следующим образом:

{
  "areaname": "name1",
  "places": [
    {
      "placename": "place1",
      "objects": [
        {
          "objname": "obj1",
          "tags": [
            "tag1",
            "tag2"
          ]
        },
        {
          "objname": "obj2",
          "tags": [
            "tag6",
            "tag7"
          ]
        }
      ]
    },
    {
      "placename": "place2",
      "objects": [
        {
          "objname": "obj45",
          "tags": [
            "tag46",
            "tag34"
          ]
        },
        {
          "objname": "obj77",
          "tags": [
            "tag56",
            "tag11"
          ]
        }
      ]
    }
  ]
}

На самом деле это довольно просто, но я не могу найти решение простого запроса, например: "вернуть имя объекта, содержащего тег1 внутри ихtag "

" Так что для данного документа, если я использую "tag1" в качестве параметра, ожидается, что запрос возвратит "obj1". Он должен дать мне тот же результат, если я использую "tag2" в качестве параметра Otherпример: используя «tag56», он должен возвращать только «obj77»

Сейчас у меня нет проблем с возвратом всего документа с использованием точечного обозначения или поля верхнего уровня, такого как areaname или других

db.users.find( {"places.objects.tags":"tag1"}, { areaname: 1, _id:0 } )

Это вообще возможно?

1 Ответ

0 голосов
/ 01 июля 2019

Проще говоря:

[
        { 
            "$match" : {
                "places.objects.tags" : "tag1"
            }
        }, 
        { 
            "$unwind" : "$places"
        }, 
        { 
            "$unwind" : "$places.objects"
        }, 
        { 
            "$match" : {
                "places.objects.tags" : "tag1"
            }
        }, 
        { 
            "$group" : {
                "_id" : "$_id", 
                "obj_names" : {
                    "$push" : "$places.objects.objname"
                }
            }
        }
    ], 

Вы должны добавить любые другие поля, которые хотите сохранить, на групповой этап, это также можно сделать без стадии двойного раскручивания, но я выбрал это для удобства чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...