Я не могу правильно получить ответ на запрос MongoDB - метод Find - PullRequest
0 голосов
/ 30 ноября 2018

Мой json:

  { 
    "user_id" : "1000" ,
    "boxes" : [
        {
            "box_id" : "12345", 
            "box_name" : "Box 3", 
            "items" : [], 
            "visible" : false 
        },
        {
            "box_id" : "2000", 
            "box_name" : "Box 1", 
            "items" : [],
            "visible" : true 
        }, 
        {
            "box_id" : "3000", 
            "box_name" : "Box 2", 
            "items" : [], 
            "visible" : true 
        }
    ], 
    "user_name" : "Jimmy", 
}

Я просто пытаюсь получить, какой ящик принадлежит user_id:"1000", который равен visible: true, а какой box_id: "3000".Мой запрос:

db.getCollection("users")
   .find({user_id:"1000", 
          $and: [{"boxes.box_id": "3000"},{"boxes.visible": true}]}, 
          {"boxes.$":1})

Но я всегда получаю box_id: 12345 один.Я не мог ничего найти об этом.Спасибо за ответы.

1 Ответ

0 голосов
/ 30 ноября 2018

Согласно документации для позиционного оператора $ , вы не можете использовать $ с несколькими условиями.Вместо этого вы должны использовать $elemMatch, чтобы обойти ограничение.

Ограничения поля массива

MongoDB требует следующего при работе с проекцией на массивы:

  • В проекционном документе может отображаться только один позиционный оператор $.
  • В документе запроса должно отображаться только одно поле массива, ограниченное оператором $ projection.Дополнительные поля массива в документе запроса могут привести к неопределенному поведению.
  • Документ запроса должен содержать только одно условие для проецируемого поля массива.Несколько условий могут перекрывать друг друга внутренне и приводить к неопределенному поведению.

В соответствии с этими требованиями следующий запрос некорректен:

db.collection.find( { <array>: <value>, <someOtherArray>: <value2> },
                    { "<array>.$": 1 } )

Чтобы указать критерии для нескольких полей документов внутриэтот массив, используйте оператор запроса $ elemMatch.Следующий запрос возвращает первый документ в массиве оценок, который имеет среднее значение более 70 и оценку более 90.

db.students.find( { grades: { $elemMatch: {
                                            mean: { $gt: 70 },
                                            grade: { $gt:90 }
                                          } } },
                  { "grades.$": 1 } )

Вы должны использовать оператор $ elemMatch, если вам нужны отдельные условия для выборадокументы и для выбора полей в этих документах.

Так что я бы попробовал запрос как:

db.users.find({ user_id:"1000", boxes: { $elemMatch: { "box_id": "3000", "visible": true } } }, {"boxes.$":1});

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