Рассчитать продолжительность на основе одного поля между двумя документами - PullRequest
0 голосов
/ 10 октября 2018

У меня много коллекций.У меня есть особенно два типа коллекций: 1.коллекции, соответствующие началу визуализации контента в платформе электронного обучения;2. коллекции, соответствующие концу визуализации этого контента.Вот пример коллекции визуализации начала и конца:

Начальная визуализация:

    "statement" : {
    "actor" : {
        "objectType" : "Agent",
        "name" : "exemple1@gmail.com",
        "mbox" : "mailto:exemple1@gmail.com"
    },
    "verb" : {
        "id" : "http://adlnet.gov/expapi/verbs/launched",
        "display" : {
            "en" : "Launching the next piece of learning content",
        }
    },
    "object" : {
        "objectType" : "Activity",
        "id" : "https://exemple1.com/activities/plannode=5857",
        "definition" : {
            "name" : {
                "en" : "calculs",
            },
            "type" : "http://id.tincanapi.com/activitytype/legacy-learning-standar"
        }
    },
    "context" : {
        "platform" : "exemple",
        "language" : "en",
    },
    "timestamp" : "2017-01-16T23:45:06+01:00",
    "id" : "0d7c852d-f1bf-45be-8a25-aff286bf1c30",
    "version" : "1.0.0"
},

Конечная визуализация:

        "statement" : {
    "actor" : {
        "objectType" : "Agent",
        "name" : "exemple1@gmail.com",
        "mbox" : "mailto:exemple1@gmail.com"
    },
    "verb" : {
        "id" : "http://adlnet.gov/expapi/verbs/terminated",
        "display" : {
            "en" : "Launching the next piece of learning content",
        }
    },
    "object" : {
        "objectType" : "Activity",
        "id" : "https://exemple1.com/activities/plannode=5857",
        "definition" : {
            "name" : {
                "en" : "calculs",
            },
            "type" : "http://id.tincanapi.com/activitytype/legacy-learning-standar"
        }
    },
    "context" : {
        "platform" : "exemple",
        "language" : "en",
    },
    "timestamp" : "2017-01-16T23:45:06+01:00",
    "id" : "0d7c852d-f1bf-45be-8a25-aff286bf1c30",
    "version" : "1.0.0"
},

Теперь я хочу сгруппировать тезисысбор по object.id и вычисление продолжительности визуализации контента = метка времени (визуализация конца контента) - метка времени (визуализация начала контента).

Я пробую следующий код, но он не работает:

db.statements.aggregate([
{$match:{'statement.verb.id':{"$in":["http://adlnet.gov/expapi/verbs/launched", "http://adlnet.gov/expapi/verbs/terminated"]}}]},
{$group:{_id:{
        objectid: "$statement.object.id",
        learner: "$statement.actor.mbox"
        },
        duration : {$subtract: ["$timestamp", "$timestamp"}]}}
       }
     }

])

Может ли кто-нибудь помочь мне рассчитать продолжительность между этими двумя коллекциями (продолжительность должна бытьрассчитывается на основе двух полей с одинаковым именем: отметка времени.

1 Ответ

0 голосов
/ 10 октября 2018

Вы можете использовать ниже агрегации.

db.statements.aggregate([
  {"$match":{"statement.verb.id":{"$in":["http://adlnet.gov/expapi/verbs/launched","http://adlnet.gov/expapi/verbs/terminated"]}}},
  {"$group":{
    "_id":{"objectid":"$statement.object.id","learner":"$statement.actor.mbox"},
    "first":{"$first":"$timestamp"},"second":{"$last":"$timestamp"}
  }},
  {"$addFields":{"duration":{"$abs":{"$subtract":["$first","$second"]}}}}
])
...