I have a collection with a subdocument tags like :
Collection News :
title (string)
tags: [tag1, tag2...]
I want to select all the tags who start with a pattern, but returning only the matching tags.
I already use a regex but it returns all the news containing the matching tag, here is the query :
db.news.find( {"tags":/^proga/i}, ["tags"] ).sort( {"tags":1} ).
limit( 0 ).skip( 0 )
My question is : How can I retrieve all the tags (only) who match the pattern ?
(The final goal is to make an autocomplete field)
I also tried using distinct, but I didn’t find a way to make a distinct with a find, it always returning me all the tags 🙁
Thanks for your time
Embedded documents are not collections. Look at your query: db.news.find will return documents from the
newscollection.tagsis not a collection, and cannot be filtered.There is a feature request for this “virtual collection feature” (SERVER-142), but don’t expect to see this too soon, because it’s “planned but not scheduled”.
You can do the filtering client-side, or move the tags to a separate collection. By retrieving only a subset of fields – only the
tagsfield – this should be reasonably fast.Hint: Your regex uses the
/iflag, which makes it impossible to use indexation. Your db strings should be case-normalized (e.g. all upper case)