Я думаю, что проблема здесь в том, что вы соединяете $elemMatch
и $where
.В контексте $where
значением this
должен быть сам документ.Однако, похоже, вы говорите, что this
является поддокументом.
Вот пример кода, который делает то, что вы хотите:
unread = function () {
for (var i in this.Participants) {
if (this.Participants[i].UserId == 2 &&
this.Participants[i].LastReadMessageIndex < this.Messages.length) {
return true;
}
}
return false;
}
db.MessageThreads.find(unread)
Единственная проблема здесь заключается в том, чтоЯ жестко запрограммировал от UserId
до 2
.Если вы планируете вызвать это из одного из драйверов клиента, вам нужно будет ввести 2
в нужное место.
Если это кажется немного «хакерским», то это так.Вы пытаетесь сравнить поддокументы в одном документе, и MongoDB не очень хорош в этом, и структура вашего документа не делает это простым.
Вы можете рассмотреть:
"Participants": {
"2": { "LastReadMessageIndex": 0 },
"1": { "LastReadMessageIndex": 1 }
}
Эти изменения не решат проблему полностью, но они значительно упростят запрос:
unread = function() {
return (this.Participants['2'].LastReadMessageIndex <
this.Messages.length);
}
Если это важный запрос, вы можете подумать о создании Map / Reduce для этого процесса.вместо этого.