Как запросить нулевую подколлекцию документов в MongoDB?

У меня есть следующие данные:

/* 1 */
{
  "_id" : 1,
  "FirstName" : "John",
  "LastName" : "Doe",
  "Test" : [{
      "TestId" : ObjectId("5046109daedabb0cf8800f3f"),
      "DateTaken" : ISODate("2012-09-10T15:46:32.866Z")
    }, {
      "TestId" : ObjectId("506e0928aedabb087c4ec9d1"),
      "DateTaken" : ISODate("2011-06-26T18:05:52.625Z"),
      "Responses" : [{
          "AnswerId" : "506e0928aedabb087c4ec98c",
          "QuestionId" : ObjectId("506e0928aedabb087c4ec98b"),
          "ResponseDate" : ISODate("2011-06-26T04:00:00Z")
        }]
    }]
}

/* 2 */
{
  "_id" : 2,
  "FirstName" : "Jane",
  "LastName" : "Doe",
  "TestHistory" : [{
      "TestId" : ObjectId("506e0928aedabb087c4ec9d1"),
      "DateTaken" : ISODate("2011-06-26T18:05:52.625Z"),
      "Responses" : [{
          "AnswerId" : "506e0928aedabb087c4ec98c",
          "QuestionId" : ObjectId("506e0928aedabb087c4ec98b"),
          "ResponseDate" : ISODate("2011-06-26T04:00:00Z")
        }]
    }]
}

Я пытаюсь написать запрос, который возвращает все экземпляры, в которых существует тест, не имеющий ответов. Я пробовал следующие запросы:

  1. { "Test.Responses": { $ существует: ложь } }
  2. { $and: [ { Test: { $exits: true } }, { "Test.Responses": { $exists: false} } ] }

Оба из них возвращают 0 результатов. Что мне не хватает?


person drneel    schedule 05.03.2013    source источник
comment
Возможный обман stackoverflow.com/ вопросы/6607102/. См. комментарий по адресу stackoverflow.com/questions/6607102/   -  person Hans N. Hjort    schedule 05.03.2013
comment
Обратите внимание, что в отличие от проверки непустого значения поля, $size не использует индекс   -  person Sammaye    schedule 05.03.2013


Ответы (1)


Я думаю, что вы ищете это:

db.foo.find({
    Test: { $elemMatch: {
        Responses: { $exists: false }
    }
})

В противном случае ваш запрос будет искать запись, в которой все документы под Test не имеют свойства Responses.

person gustavohenke    schedule 05.03.2013