Получение четкой агрегации поля массива по индексам
Я пытаюсь изучить MongoDB и как он будет полезен для аналитики для меня. Я просто играю с консолью JavaScript, доступной на их веб-сайте, и создал следующие элементы:
{"title": "Cool", "_id": {"$oid": "503e4dc0cc93742e0d0ccad3"}, "tags": ["twenty", "sixty"]}
{"title": "Other", "_id": {"$oid": "503e4e5bcc93742e0d0ccad4"}, "tags": ["ten", "thirty"]}
{"title": "Ouch", "_id": {"$oid": "503e4e72cc93742e0d0ccad5"}, "tags": ["twenty", "seventy"]}
{"title": "Final", "_id": {"$oid": "503e4e72cc93742e0d0ccad6"}, "tags": ["sixty", "seventy"]}
То, что я хотел бы сделать, это запрос, поэтому я получаю список уникальных тегов для всех этих объектов. Результат должен выглядеть примерно так:
["ten", "twenty", "thirty", "sixty", "seventy"]
Как мне запросить это? Я пытаюсь выполнить distinct()
, но вызов всегда терпит неудачу, даже не запрашивая.
Ответы
Ответ 1
Код, который не работает на их веб-сайте, работает с реальным экземпляром MongoDB:
> db.posts.insert({title: "Hello", tags: ["one", "five"]});
> db.posts.insert({title: "World", tags: ["one", "three"]});
> db.posts.distinct("tags");
[ "one", "three", "five"]
Weird.
Ответ 2
Вы должны иметь возможность использовать это:
db.mycollection.distinct("tags").sort()
Ответ 3
Вы можете использовать структуру агрегации. В зависимости от того, как вы хотите структурировать результаты, вы можете использовать либо
var pipeline = [
{"$unwind": "$tags" } ,
{ "$group": { _id: "$tags" } }
];
R = db.tb.aggregate( pipeline );
printjson(R);
{
"result" : [
{
"_id" : "seventy"
},
{
"_id" : "ten"
},
{
"_id" : "sixty"
},
{
"_id" : "thirty"
},
{
"_id" : "twenty"
}
],
"ok" : 1
}
или
var pipeline = [
{"$unwind": "$tags" } ,
{ "$group":
{ _id: null, tags: {"$addToSet": "$tags" } }
}
];
R = db.tb.aggregate( pipeline );
printjson(R);
{
"result" : [
{
"_id" : null,
"tags" : [
"seventy",
"ten",
"sixty",
"thirty",
"twenty"
]
}
],
"ok" : 1
}
Ответ 4
Есть несколько доступных консолей веб-монго:
Но если вы введете в них помощь, вы поймете, что они поддерживают только небольшое количество опций:
HELP
Note: Only a subset of MongoDB features are provided here.
For everything else, download and install at mongodb.org.
db.foo.help() help on collection method
db.foo.find() list objects in collection foo
db.foo.save({a: 1}) save a document to collection foo
db.foo.update({a: 1}, {a: 2}) update document where a == 1
db.foo.find({a: 1}) list objects in foo where a == 1
it use to further iterate over a cursor
Поскольку такой отдельный не работает, потому что он не поддерживается.
Ответ 5
Другой способ получения уникальных элементов массива с использованием конвейера агрегации
db.blogs.aggregate(
[
{$group:{_id : null, uniqueTags : {$push : "$tags"}}},
{$project:{
_id : 0,
uniqueTags : {
$reduce : {
input : "$uniqueTags",
initialValue :[],
in : {$let : {
vars : {elem : { $concatArrays : ["$$this", "$$value"] }},
in : {$setUnion : "$$elem"}
}}
}
}
}}
]
)
коллекция
> db.blogs.find()
{ "_id" : ObjectId("5a6d53faca11d88f428a2999"), "name" : "sdfdef", "tags" : [ "abc", "def", "efg", "abc" ] }
{ "_id" : ObjectId("5a6d5434ca11d88f428a299a"), "name" : "abcdef", "tags" : [ "abc", "ijk", "lmo", "zyx" ] }
>
трубопровода
> db.blogs.aggregate(
... [
... {$group:{_id : null, uniqueTags : {$push : "$tags"}}},
... {$project:{
... _id : 0,
... uniqueTags : {
... $reduce : {
... input : "$uniqueTags",
... initialValue :[],
... in : {$let : {
... vars : {elem : { $concatArrays : ["$$this", "$$value"] }},
... in : {$setUnion : "$$elem"}
... }}
... }
... }
... }}
... ]
... )
результат
{ "uniqueTags" : [ "abc", "def", "efg", "ijk", "lmo", "zyx" ] }