Как найти все строки, которые имеют подполе во вложенных записях? PyMongo - PullRequest
0 голосов
/ 18 июня 2020

Все мои записи структурированы следующим образом:

{ 'name': 'John Doe',
  'atributes' : {
       'alive' : {'start':15816412115, 'end':1516186131 },
       'job'   : 'developer',
       'title' : 'senior',
   }
},
{ 'name': 'John Cena',
  'atributes-2017' : {
       'alive' : {'start':15816412115, 'end':1516186131 },
       'job'   : 'dancer',
   }
}

Как выбрать только записи, которые имеют подполе заголовок в атрибутах и ​​атрибутах-2017:

I пробовал с этим:

clients.find({'*': {'title': {'$exists': True }  }})

1 Ответ

1 голос
/ 18 июня 2020

Будет полезен следующий запрос:

db.collection.aggregate([
  {
    $group: {
      _id: null,
      docs: {
        $push: "$$ROOT"
      }
    }
  },
  {
    $project: {
      docs: {
        $map: {
          input: "$docs",
          as: "d",
          in: {
            $objectToArray: "$$d"
          }
        }
      }
    }
  },
  {
    $unwind: "$docs"
  },
  {
    $match: {
      "docs.v.title": {
        $exists: true
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: "$docs"
      }
    }
  }
])

MongoPlayGroundLink

Мое предложение: не оставлять разные поля. Вы должны сохранить одни и те же поля во всех документах и ​​добавить дополнительную информацию в качестве подполей (а не в название поля). Как показано ниже:

{ 'name': 'John Doe',
  'atributes' : {
       'alive' : {'start':15816412115, 'end':1516186131 },
       'job'   : 'developer',
       'title' : 'senior',
   }
},
{ 'name': 'John Cena',
  'atributes' : {
       'alive' : {'start':15816412115, 'end':1516186131 },
       'job'   : 'dancer',
       'year'  : 2017
   }
}

В противном случае запрос будет затруднен.

...