получить все записи с сортировкой по совокупности, где ключ сортировки - поле массива - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь получить все записи по условию соответствия, а затем хочу получить результат в отсортированном формате с использованием агрегирования pymongo. Вот моя коллекция выглядит так:

[{
    "userId" : "user1",
    "name" : "USER 1",
    "description":"User has mobile no.",
    "contacts" : [ 
        {
            "type" : "home",
            "number" : "1234"
        },
        {
            "type" : "mobile",
            "number" : "3456"
        }
    ],
    "contactTypes" : [ 
        "home", "mobile"
    ]
},
{
    "userId" : "user2",
    "name" : "USER 2",
    "description":"User has office and no mobile number",
    "contacts" : [ 
        {
            "type" : "office",
            "number" : "1111"
        }
    ],
    "contactTypes" : [ 
        "office"
    ]
},
{
    "userId" : "user3",
    "name" : "USER 3",
    "description":"User has office no",
    "contacts" : [ 
        {
            "type" : "home",
            "number" : "1111"
        },
        {
            "type" : "office",
            "number" : "2222"
        }
    ],
    "contactTypes" : [ 
        "home", "office"
    ]
}]

Теперь я хочу получить все документы, имеющие тип контакта Mobileили в описании есть мобильное слово (это вернет первые 2 документа), а также нужно отсортировать возвращаемый результат по contact.number.Так как у user2 есть contacts.number "1111", он должен сначала выглядеть следующим образом:

    "userId" : "user2",
    "name" : "USER 2",
    "description":"User has office and no mobile number",
    "contacts" : [ 
        {
            "type" : "office",
            "number" : "1111"
        }
    ],
    "contactTypes" : [ 
        "office"
    ]
},{
    "userId" : "user1",
    "name" : "USER 1",
    "description":"User has mobile no.",
    "contacts" : [ 
        {
            "type" : "home",
            "number" : "1234"
        },
        {
            "type" : "mobile",
            "number" : "3456"
        }
    ],
    "contactTypes" : [ 
        "home", "mobile"
    ]
}]

Поэтому мой запрос выглядит следующим образом:

db.collection.aggregate(
[
  {
    "$unwind": "contacts"
  },
  {
    "$match": {
      "$or": [
        {
          "description": {
            "$regex": "mobile"
          }
        },
        {
          "contactTypes": {
            "$regex": "mobile"
          }
        }
      ]
    }
  },
  {
    "$sort": {"contacts.number":1}
  }
]
)

Но я получаю сообщение об ошибке типа - "не могусортировать по ключам, которые являются параллельными массивами "

Не уверен, что мне здесь не хватает или как мне написать запрос выше.

...