Добавить элемент в массив Mon go - PullRequest
1 голос
/ 10 июля 2020

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

Вот что я делаю.

# My function to update the array
def append_site(gml_id, new_site):
    col.update_one({'gml_id': gml_id}, {'$push': {'websites': new_site}}, upsert = True)
# My Dataframe
data = {'name':['ABC'], 
        'gml_id':['f9395e09'],
        'url':['ABC.com']
        }
df = pd.DataFrame(data)

# Grouping data for upsert
df = df.groupby(['gml_id']).apply(lambda x: x[['name','url']].to_dict('r')).reset_index().rename(columns={0:'websites'})
# Apply function to every row
df.apply(lambda row: append_site(row['gml_id'], row['websites']), axis = 1)

Вот результат:

{
    "gml_id": "f9395e09",
    "websites": [
        {
            "name": "XYZ.com",
            "url": "...xyz.com"
        },
        [
            {
                "name": "ABC.com",
                "url": "...abc.com"
            }
        ]
    ]
}

Вот цель:

{
    "gml_id": "f9395e09",
    "websites": [
        {
            "name": "XYZ.com",
            "url": "...xyz.com"
        },
        {
            "name": "ABC.com",
            "url": "...abc.com"
        }
    ]
}

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Вместо того, чтобы делать бессмысленную groupby, я решил оставить фрейм данных плоским, а затем настроить функцию следующим образом:

def append_site(gml_id, name, url):
    col.update_one({'gml_id': gml_id}, {'$push': {'websites': {'name': name, 'url': url}}}, upsert = True)

Теперь я называю это так: df.apply(lambda row: append_site(row['gml_id'], row['url'], row['name']), axis = 1)

Работает отлично.

0 голосов
/ 10 июля 2020

Ваша проблема в том, что к массиву websites добавляется объект list, а не dict, то есть new_site - это list.

Поскольку вы не опубликовали где вы вызываете append_site(), это немного спекулятивно, но вы можете попробовать изменить эту строку и посмотреть, дает ли она нужный вам эффект.

col.update_one({'gml_id': gml_id}, {'$push': {'websites': new_site[0]}}, upsert = True)

В качестве альтернативы убедитесь, что вы передаете объект dict к функции.

...