Mongodb: запрос элементов массива в документе - PullRequest
1 голос
/ 08 октября 2011

У меня есть коллекция, которую я хотел бы запросить следующим образом:

  • вернуть все документы
  • до 2 комментариев (например, срез, 0, 1 или 2)комментарии)
  • все комментарии должны иметь представления> 10

Похоже, мне нужно создать функцию для оценки каждого документа в отдельности, но не ясно, как это делается, особенно учитывая, что яхочу сделать срез и вернуть до n элементов, соответствующих этому критерию.

Пример схемы:

{
    title: "One",
    comments: [
        {
            title: "comment1",
            views: 9
        },
        {
            title: "comment2",
            views: 10
        },
        {
            title: "comment3",
            views: 11
        },
        {
            title: "comment4",
            views: 12
        },
    ]
}

Я хочу сделать что-то вроде:

db.collection.find({"comments.views": {$gt: 10}}, {comments:{$slice: 2}})

Ноэто возвращает любой документ с комментарием с> 10 представлениями, а затем разрезает 2 комментария ... Я хочу вернуться к тем комментариям, которые имеют> 10 элементов.Я не могу сделать это на клиенте И использовать $ slice без потери некоторых комментариев, поэтому мне нужно сделать это на БД.Мысли?

Ответы [ 2 ]

1 голос
/ 09 октября 2011

Но это возвращает любой документ с комментарием с> 10 представлениями, а затем срезает 2 комментария

Это поведение фильтрации многоуровневого внедренного документа, обычно соответствующий фильтр возвращаетвесь документ, а не подмножества.

Обычно позиционный оператор $ используется для сопоставления вложенных документов в обновлениях.Но эта функция еще не реализована в спецификаторах возврата.

В mongo существует нерешенная проблема Поддержка позиционного оператора ($) в полях, возвращающих спецификацию r.(Пожалуйста, войдите, чтобы проголосовать, если вам действительно нужна эта функция)

Таким образом, вы должны обработать

  • до 2 комментариев (например, срез, 0, 1 или 2 комментария).)

часть в вашем приложении, проходя через все коллекции.

0 голосов
/ 18 мая 2015

вы можете взглянуть на агрегацию. Сначала нужно его раскрутить, затем применить фильтр:

db.<your collection>.aggregate( [ { $unwind : "$comments" }, 
    {$match:{"comments.views": {$gt: 10}}} ] )

Проверьте результаты и примените к этому другие операции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...