Mongo: выбор элементов X из массива, помещенного в объект - PullRequest
3 голосов
/ 30 сентября 2011

У меня есть следующая коллекция для пользователя в MongoDB:

{
  "_id" : 1,
  "facebook_id" : XX,
  "name": "John Doe",
  "points_snapshot" : [{
      "unix_timestamp" : 1312300552,
      "points" : 115
    }, {
      "unix_timestamp" : 1312330380,
      "points" : 110
    }, {
      "unix_timestamp" : 1312331610,
      "points" : 115
    }]
}

Можно ли написать один запрос, по которому я могу получить пользователя с идентификатором 1 вместе со снимками после определенного дня?,Например: 1312330300?

По существу, снимки ограничены числами X, соответствующими некоторым критериям?

До сих пор я пробовал в C #:

Query.And(
 Query.EQ("facebook_id", XX), 
 Query.GTE("points_snapshot.unix_timestamp", sinceDateTimeStamp)))
 .SetFields("daily_points_snapshot", "facebook_id")

, который я вскоре понял, будетне работает для того, что я хочу.

Любая помощь будет оценена!Спасибо!

РЕДАКТИРОВАТЬ: Мое решение для этого

Если кто-то хочет получить быстрое решение этой проблемы, это то, что я в итоге сделал:

var points = MyDatabase[COLLECTION_NAME]
                .Find(Query.EQ("facebook_id", XX))
                .SetFields("points_snapshot", "facebook_id")
                .FirstOrDefault();

if (points != null) {
        var pointsArray = points.AsBsonDocument["points_snapshot"].AsBsonArray
        .Where(x => x.AsBsonDocument["unix_timestamp"].AsInt32 > sinceDateTimeStamp)
        .ToList();

        return pointsArray;
}

1 Ответ

1 голос
/ 30 сентября 2011

Можно ли написать один запрос, по которому я могу получить пользователя с идентификатором 1 вместе со снимками после определенного дня.Например: 1312330300?

Невозможно.

Проблема здесь в том, что запросы MongoDB возвращают все соответствующие Документы.Ваш Документ содержит массив объектов, но MongoDB не рассматривает их как «Документы».

Теперь вы можете ограничить возвращаемые поля, но в вашем случае вы действительно хотитеограничьте возвращаемые «части массива».

Это давняя проблема, билет JIRA здесь .Билет датирован около 18 месяцев назад и продолжает возвращаться.Поэтому, если этот тип запроса имеет решающее значение для вашей архитектуры, вам, возможно, придется изменить архитектуру.

...