MongoDB, как мне создать массив с пользовательскими ключами, содержащим вложенный документ

Хорошо, поэтому, используя Python и MongoDB, я пытаюсь встроить вложенный документ в массив с пользовательским значением ключа в массиве. Я экспериментировал со всевозможными способами сделать это, и я не мог понять, что я делаю неправильно, поэтому я временно остановился на рабочем коде ниже. Многочисленные попытки всегда приводят к ошибке:

в _check_write_command_response поднять OperationFailure(error.get("errmsg"), error.get("код"), error) pymongo.errors.OperationFailure: пунктирное поле 'first.rule' в 'followedBy..first.rule' не действительны для хранения.

Код:

 citizens.update(
    {"_id" : userPush},
    {"$push": {"followedBy":[field[1], field[2], field[3], field[0]]}})

Производит:

 "_id" : ObjectId("5…asfd"), 
            "uName" : "tim0", 
            "fName" : "tim",
            "lName" : "lost",
            "pic" : null, 
            "bio" : "I <3 MongoDB", 
            "followedBy" : [
                [
                    "BobTheBomb", 
                    "bobby", 
                    "knight", 
                    NumberInt(2)
                ], 
                [
                    "Robert", 
                    "DROP", 
                    "TABLE", 
                    NumberInt(6)
                ]

Это то, что я хочу:

"_id" : ObjectId("5…asfd"), 
    "uName" : "tim0", 
    "fName" : "tim",
    "lName" : "lost",
    "pic" : null, 
    "bio" : "I <3 MongoDB", 
    "followedBy" : [
            "BobTheBomb": { 
                    "fName" : "bobby", 
                    "lName" : "knight", 
                    "uID" : NumberInt(2)
        }, 
            "Robert": { 
                    "fName" : " DROP ", 
                    "lName" : " TABLE ", 
                    "uID" : NumberInt(6)
        }
    ]

person user3586062    schedule 12.03.2015    source источник


Ответы (1)


Вам нужно будет построить эту структуру данных, в настоящее время вы говорите, что "followedBy" - это всего лишь список.

так что постарайтесь:

citizens.update(
    {"_id" : userPush},
    {"$push": {"followedBy":{field[1]: { "fName":field[2], "lName":field[3], "uID":field[0]}}}})

Удалите список и замените его на dict.

Я надеюсь, что это поможет.


Я понял, что не дал вам действительный json, я проверил это:

citizens.update(
    {"_id" : userPush},
    {$push: 
    {"followedBy":
        [
            {field[1]: 
                { "fName": field[2], "lName": field[3], "uID": field[0]}
            }
        ]
    } 
})

И это сработало...


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

MongoDB предоставляет несколько различных модификаторов, которые вы можете использовать для обновления документов на месте, включая следующие (дополнительные сведения см. в разделе updates). ):

- $inc Increment a numeric field (generalized; can increment by any number)
- $set Set certain fields to new values
- $unset Remove a field from the document
- $push Append a value onto an array in the document
- $pushAll Append several values onto an array
- $addToSet Add a value to an array if and only if it does not already exist
- $pop Remove the last (or first) value of an array
- $pull Remove all occurrences of a value from an array
- $pullAll Remove all occurrences of any of a set of values from an array
- $rename Rename a field
- $bit Bitwise updates

вы можете обнаружить, что, поскольку вы вставляете много элементов, которые вы бы предпочли использовать $pushAll или $addToSet, а не $push... Просто предположение...

person Renier    schedule 12.03.2015
comment
Он вернул pymongo.errors.OperationFailure: пунктирное поле «first.rule» в «followedBy..0.first.rule» недопустимо для хранения. Я продолжал сталкиваться с этой ошибкой на раннем этапе, а также с несколькими другими, когда пытался ее настроить. - person user3586062; 12.03.2015
comment
Это создает поле литеральных строк [1]. Вывод: followBy : [ {field[1] : { uID : field[0], fName : field[2], lName : field[3] } - person user3586062; 12.03.2015
comment
о, извините за это .. Я использовал строковые значения для проверки вывода - попробуйте обновленный - person Renier; 12.03.2015
comment
Нет, ты в порядке, я очень ценю помощь. Я попробовал обновленный код, и он все еще дает мне упрямую ошибку: в _check_write_command_response поднять OperationFailure (error.get (errmsg), error.get (код), ошибка) pymongo.errors.OperationFailure: пунктирное поле «first.rule» в 'followedBy..first.rule' недопустимо для хранения. Я собираюсь лечь спать и сделать еще одну попытку завтра. Спасибо вам за помощь - person user3586062; 12.03.2015
comment
Все еще не повезло, я застрял на той же ошибке, и я не понимаю ошибку - person user3586062; 13.03.2015
comment
проверьте эти вопросы: stackoverflow.com/q/12784423/2173793, stackoverflow.com/q/19709624/2173793, stackoverflow.com/q/13894769 /2173793, stackoverflow.com/questions/ 6041109/. возможно, один из них поможет решить вашу проблему. и не могли бы вы обновить свой вопрос с полной трассировкой стека? - person Renier; 13.03.2015