Я пытаюсь создать совокупность наиболее просматриваемого элемента (авторов).
Вот моя коллекция пользователей:
{
"_id" : ObjectId("54008ac8145a6cc5058b456b"),
"history" : {
"authors" : [
{
"name" : "michou",
"count" : {
"all" : NumberLong(1),
"2014" : NumberLong(1),
"201408" : NumberLong(1),
"2014w35" : NumberLong(1)
}
}
]
}
}
{
"_id" : ObjectId("54008ac8145a6ccb058b4570"),
"history" : {
"authors" : [
{
"name" : "petitBonhommeEnMousse",
"count" : {
"all" : NumberLong(2),
"2014" : NumberLong(2),
"201408" : NumberLong(2),
"2014w35" : NumberLong(2)
}
},
{
"name" : "lordVador",
"count" : {
"all" : NumberLong(1),
"2014" : NumberLong(1),
"201408" : NumberLong(1),
"2014w35" : NumberLong(1)
}
}
]
}
}
{
"_id" : ObjectId("54008ac8145a6ccf058b456c"),
"history" : {
"authors" : [
{
"name" : "lordVador",
"count" : {
"all" : NumberLong(1),
"2014" : NumberLong(1),
"201408" : NumberLong(1),
"2014w35" : NumberLong(1)
}
}
]
}
}
То, что я хотел бы получить список количества времени, которое пользователь видел автор в течение последних трех недель.
Для этого, когда пользователь видит страницу, я увеличиваю значение ключа «2014w35», «2014w36» ... (номер недели в году).
Вот первая попытка:
db.users.aggregate(
[
{ $match: { history_updated: "20140829" } },
{ $unwind: "$history.authors" },
{ $group :
{
"_id" : "$history.authors.name",
"total2014w35" : {"$sum" : "$history.authors.count.2014w35"},
"total2014w34" : {"$sum" : "$history.authors.count.2014w34"},
"total2014w33" : {"$sum" : "$history.authors.count.2014w33"}
}
},
{ $project: {
"_id" : 1,
"total" : {
$add : [
"$total2014w35",
"$total2014w34",
"$total2014w33"
]
}
}
}
]
)
который возвращает список авторов видели и сколько раз, но не отделены друг от пользователя. это общая:
{ "_id" : "lordVador", "total" : NumberLong(2) }
{ "_id" : "petitBonhommeEnMousse", "total" : NumberLong(2) }
{ "_id" : "michou", "total" : NumberLong(1) }
Моя вторая attemps была группе _id:
db.users.aggregate(
[
{ $match: { history_updated: "20140829" } },
{ $unwind: "$history.authors" },
{
$group :
{
"_id" : "$_id",
....
Что, конечно, возвращает общее число авторов просмотра пользователем. Но без автора.
{ "_id" : ObjectId("54008ac8145a6ccb058b4570"), "total" : NumberLong(3) }
{ "_id" : ObjectId("54008ac8145a6ccf058b456c"), "total" : NumberLong(1) }
{ "_id" : ObjectId("54008ac8145a6cc5058b456b"), "total" : NumberLong(1) }
То, что я хотел бы иметь представляет собой смесь обоих. Я хотел бы иметь для каждого пользователя (документ в коллекции) список авторов, для каждого, сколько раз пользователь видел его/ее, в течение последних 3 недель.
Что-то вроде:
{ "_id" : ObjectId("54008ac8145a6ccb058b4570"), [{ "lordVador" : NumberLong(3) },{ "michou" : NumberLong(1) } ] }
{ "_id" : ObjectId("54008ac8145a6ccf058b456c"), [{ "petitBonhommeEnMousse" : NumberLong(1) } ] }
{ "_id" : ObjectId("54008ac8145a6cc5058b456b"), [{ "lordVador" : NumberLong(1) } ] }
У кого из вас есть какие-либо идеи, как их смешивать?
Я не понимаю, что вам нужно. Пожалуйста, объясните более четко. Что такое пользователь? Каждый из документов, которые вы приводите в качестве примеров, представляет пользователя? В этом случае, похоже, информация, которую вы хотите, в значительной степени находится только в оригинальном документе. Каковы странные ключи, такие как «2014w35»? Почему вы (по-видимому) используете значения в качестве ключей? Почему вы не используете даты? – wdberkeley
Привет, извините, если не ясно. Я обновил свой вопрос. Да, каждый документ в коллекции является одним пользователем. Я хотел бы иметь для каждого пользователя (документ в коллекции) список авторов, для каждого, сколько раз пользователь видел его/ее, в течение последних 3 недель. 2014w35 представляют 35-ю неделю 2014 года. Я не использовал даты, потому что я хранил их по неделям. –