Как преобразовать строку в дату в mongodb? - PullRequest
1 голос
/ 08 октября 2019

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

#DB Name: test 
#Collection Name: firstcollection

{ 
    "_id" : ObjectId("5d8b51e80eeb1c27ce119e52"), 
    "url" : "http://192.168.1.37/second.html", 
    "browser" : "Netscape", 
    "uniqueId" : "dd0c76b1-77c7-445a-8bcd-e58cb239507e", 
    "ip" : " 162.158.166.103", 
    "date" : "25/09/2019 16:37:56"
}
// ----------------------------------------------
{ 
    "_id" : ObjectId("5d8b51e80eeb1c27ce119e62"), 
    "url" : "http://192.168.1.37/second.html", 
    "browser" : "Netscape", 
    "uniqueId" : "c3a3c5f8-23a8-4626-9b43-b5a95fb02597", 
    "ip" : " 172.69.134.115", 
    "date" : "25/09/2019 16:38:13"
}

Здесь я хочу конвертировать date в формате String в Date. Я пробовал этот код

> db.firstcollection.aggregate([
...     {$project:{ date:{$dateFromString:{dateString:'$date'}}}}
... ])

Но он показывает ошибку

assert: command failed: {
    "ok" : 0,
    "errmsg" : "Error parsing date string '25/09/2019 16:37:56'; 0: Unexpected character '2'",
    "code" : 40553,
    "codeName" : "Location40553"
} : aggregate failed
_getErrorWithCode@src/mongo/shell/utils.js:25:13
doassert@src/mongo/shell/assert.js:16:14
assert.commandWorked@src/mongo/shell/assert.js:403:5
DB.prototype._runAggregate@src/mongo/shell/db.js:260:9
DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1212:12
@(shell):1:1

Я пробовал это также, но он не показывает аргумент формата

db.firstcollection.aggregate([
    { "$addFields": {
        "date": { 
            "$dateFromString": { 
                "dateString": "$date",
                "format": "%d-%m-%Y %H%M%S" 
            } 
        }
    } }
])

Я обнаружил, что MongoDB 3.6 удалил format аргумент в dateFromString из этого ответа Так что я не могу указать формат.

Я также запутался с руководством MongoDB 3.6

В первой ссылке на руководство 3.6 указано, что есть аргумент формата Первая ссылка на руководство В другой ссылке на руководство 3.6,в нем нет аргумента формата Second Manual Link

Так что я не знаю, как решить эту проблему. Предложите мне несколько решений для преобразования string в date в MongoDB. Я хочу получить данные из MongoDB с помощью указанного from and to date. Поскольку это строка, я не могу получить правильные данные. Помогите мне с некоторыми решениями

1 Ответ

3 голосов
/ 08 октября 2019

Поскольку вы пометили это с помощью pymongo, следующий подход является быстрым:

from pymongo import MongoClient
import datetime

db = MongoClient()['testdatabase']

db.testcollection.insert_one({
    "url" : "http://192.168.1.37/second.html",
    "browser" : "Netscape",
    "uniqueId" : "dd0c76b1-77c7-445a-8bcd-e58cb239507e",
    "ip" : " 162.158.166.103",
    "date" : "25/09/2019 16:37:56"
})
db.testcollection.insert_one({
    "url" : "http://192.168.1.37/second.html",
    "browser" : "Netscape",
    "uniqueId" : "c3a3c5f8-23a8-4626-9b43-b5a95fb02597",
    "ip" : " 172.69.134.115",
    "date" : "25/09/2019 16:38:13"
})

for item in db.testcollection.find():
    if 'date' in item:
        item['date'] = datetime.datetime.strptime(item['date'], '%d/%m/%Y %H:%M:%S')
        db.testcollection.replace_one({'_id': item['_id']}, item)

Результат:

> db.testcollection.find({}, {'_id': 0}).pretty()
{
        "url" : "http://192.168.1.37/second.html",
        "browser" : "Netscape",
        "uniqueId" : "dd0c76b1-77c7-445a-8bcd-e58cb239507e",
        "ip" : " 162.158.166.103",
        "date" : ISODate("2019-09-25T16:37:56Z")
}
{
        "url" : "http://192.168.1.37/second.html",
        "browser" : "Netscape",
        "uniqueId" : "c3a3c5f8-23a8-4626-9b43-b5a95fb02597",
        "ip" : " 172.69.134.115",
        "date" : ISODate("2019-09-25T16:38:13Z")
}
...