Let’s say I have this document:
{
"_id": objectId(),
"products": [
{
"product_id": ""
}
]
}
I would like to make that the key product_id
of documents in the array products
must be unique for that document in the collection, (i don’t want it to affect other documents in the collection).
I tried to use the next command in mongosh console:
db.season.createIndex({products.product_id:1},{unique:true})
But it doesn’t work. the console says:
Error: clone(t={}){const r=t.loc||{};return e({loc:new Position("line"in r?r.line:this.loc.line,"column"in r?r.column:...<omitted>...)} could not be cloned.
2
Answers
Unfortunately, that is not possible. The index only works across multiple documents. You can have repeating values within the same document.
See this.
The answer from @Khanna111 correctly answers the original question about the current limitation on enforcing uniqueness within an array on a single document. A (longstanding) ticket to track that feature is SERVER-1068.
That said, I believe there is a way to achieve what you want. As noted in one of the comments on that ticket, you can use document validation instead. Using that comment as a guide, I ran the following:
With this validation in place I was able to successfully insert documents that did not have duplicates. For example:
It correctly failed when I attempted to insert a (single) document which contained duplicate values in its array:
Separately, regarding this:
That error message is unrelated to the actual problem at hand. Instead it means that you have some typo in the command. It’s impossible to say what it is without seeing the actual command that you are trying to execute, but as an educated guess be sure that you put quotation marks around nested fields when trying to create an index, eg: