У меня есть следующие данные json в mongodb.
[
{
"_id": 1,
"name": "user1",
"userActivities": [
{
"actionTaken": "Sign in.",
"progress": "Success."
},
{
"actionTaken": "logout",
"progress": "Success."
}
]
},
{
"_id": 2,
"name": "user2",
"userActivities": [
{
"actionTaken": "Sign in.",
"progress": "Success."
},
{
"actionTaken": "logout",
"progress": "Success."
}
]
},
{
"_id": 3,
"name": "user3",
"userActivities": [
{
"actionTaken": "Sign in.",
"progress": "Success."
},
{
"actionTaken": "logout",
"progress": "Success."
}
]
},
{
"_id": 4,
"name": "user4",
"userActivities": [
{
"actionTaken": "Sign in.",
"progress": "Success."
},
{
"actionTaken": "logout",
"progress": "Success."
}
]
},
{
"_id": 5,
"name": "user5",
"userActivities": [
{
"actionTaken": "Sign in.",
"progress": "Success."
},
{
"actionTaken": "logout",
"progress": "Success."
}
]
},
{
"_id": 6,
"name": "user6",
"userActivities": [
{
"actionTaken": "Sign in.",
"progress": "Success."
},
{
"actionTaken": "logout",
"progress": "Success."
}
]
},
{
"_id": 7,
"name": "user7",
"userActivities": [
{
"actionTaken": "Sign in.",
"progress": "Success."
},
{
"actionTaken": "logout",
"progress": "Success."
}
]
},
{
"_id": 8,
"name": "user8",
"userActivities": [
{
"actionTaken": "Sign in.",
"progress": "Success."
},
{
"actionTaken": "logout",
"progress": "Success."
}
]
}
]
Я запрашиваю данные для разбиения на страницы следующим образом.
[
{
"$match": {
"userActivities": {
"actionTaken": "Sign in."
}
}
},
{
"$sort": {
"name": -1
}
},
{
"$project": {
"name": 1,
"userActivities": {
"$filter": {
"input": "$userActivities",
"as": "userActivities",
"cond": {
"$eq": [
"$$userActivities.actionTaken",
"Sign in."
]
}
}
}
}
},
{
"$skip": 2
},
{
"$limit": 2
}
]
Но не получает никаких данных, даже если они соответствуют критериям фильтра. Если я удалю поле progress
из выборки данных, оно даст мне данные.
Нужно ли что-то делать по-другому, когда в столбце для запроса есть несколько полей?
Используйте точечную запись на этапе $match
.
{
"$match": {
"userActivities.actionTaken": "Sign in."
}
}
Образец игровой площадки Mongo
Этот документы может быть вам полезен.
Может я что-то не так делал в прошлый раз. Но теперь это работает.
Возможно, добавьте «прогресс» на этапе сопоставления, иначе вы сопоставляете только объекты с одним полем actionTaken, которых нет в коллекции:
{
"$match": {
"userActivities": {
"actionTaken": "Sign in.",
"progress": "Success."
}
}
}
Образец игровой площадки Mongo
это неосуществимо. добавить прогресс также в фильтр, так как это не фактический фильтр.
действительно, вам лучше выполнить поиск с помощью точечной нотации «userActivities.actionTaken», как это было предложено @Yong Shun, и создать индекс для этого поля ...
Я получил ответ. Выложили сейчас.
поиск по точечной записи с индексом будет быстрее...
elemMatch лучше использовать, когда у вас есть более одного поля для поиска в подобъекте...
но запись через точку не работает. Я пробовал это.
в порядке. создать индекс для этого поля. Я пропустил эту часть. elemMatch на данный момент в порядке, так как у меня нет таких больших данных в таблице. Может быть, я рассмотрю для других таблиц, возможно. Но другие таблицы не имеют вложенных данных.
Давайте продолжить обсуждение в чате.
Получил ответ, приняв помощь от одного человека. Мне пришлось использовать $elemMatch следующим образом.
[
{
"$match": {
"userActivities": {
"$elemMatch": {
"actionTaken": "Sign in."
}
}
}
},
{
"$sort": {
"name": -1
}
},
{
"$project": {
"name": 1,
"userActivities": {
"$filter": {
"input": "$userActivities",
"as": "userActivities",
"cond": {
"$eq": ["$$userActivities.actionTaken", "Sign in."]
}
}
}
}
},
{
"$skip": 2
},
{
"$limit": 2
}
]
пытался. не работал.