MongoDB находит значение внутри массива

Если у меня есть эта схема...

person = {
emails : Array
}

Значения хранятся в массиве писем, как указано ниже:

emails : [{ a : "[email protected]" , b: "[email protected]" , c : "[email protected]" }]

Теперь я попробовал указанные ниже запросы,

 Person.findOne({emails : "[email protected]"}).exec(function(err,person){

 });

Собственный запрос MongoDB

Person.native(function(err,collection){

collection.find( emails : { "$in" : "[email protected]"} , function(err , result){
    //code
 });

});

ОТРЕДАКТИРОВАННЫЙ ВОПРОС

Теперь я попытался использовать ИЛИ, как показано ниже.

Person.findOne({ 
"or": [ 
    {"emails.a": "[email protected]" },
    {"emails.b": "[email protected]" },
    {"emails.c": "[email protected]" }
]
}, function(err,doc) { });

На самом деле, я должен проверить, есть ли у «emails.a» «[email protected]», если не только, я должен найти, есть ли у «emails.b» или «emails.c» «[email protected]».

если «emails.a» имеет «[email protected]», то документ должен вернуть вывод. в противном случае поиск «[email protected]» продолжается в «emails.b» или «emails.c».

Как я могу это сделать?

Но я не получил требуемый результат, используя приведенный выше запрос. Пожалуйста помоги. Большое спасибо.


person Mahahari    schedule 28.03.2014    source источник
comment
Можете ли вы прокомментировать, почему вы храните свои электронные письма в массиве с одним значением, которое является объектом с ключами a, b, c, а не простым массивом? Если бы у вас было только emails: ["[email protected]", "[email protected]", "[email protected]"], то то, что вы пытаетесь, сработало бы нормально.   -  person sgress454    schedule 29.03.2014


Ответы (1)


Ваш массив содержит вложенный документ с ключами a, b и c. Чтобы сопоставить нужное значение, вам нужно указать этот элемент.

Person.findOne({ "emails.a": "[email protected]" }, function(err,doc) {

Если вы планируете сделать это в разных полях, объедините это с $or:

Person.findOne({ 
    "$or": [ 
        {"emails.a": "[email protected]" },
        {"emails.b": "[email protected]" },
        {"emails.c": "[email protected]" }
    ]
}, function(err,doc) {

Обратите внимание, что это соответствует «документу», а не только элементу массива.

Также см. описание оператора $elemMatch.

person Neil Lunn    schedule 28.03.2014
comment
Спасибо за ваш быстрый ответ. В случае, электронные письма: [{a: [email protected], b: [email protected], c: [email protected]}]. В этом a , b и c не будут всегда. если я использую $or, он выдает mongoerror: $or требует непустого массива - person Mahahari; 28.03.2014
comment
@ Махахари, вы уверены, что делаете это точно так же, как показано. Запрос работает для меня. - person Neil Lunn; 28.03.2014
comment
Person.findOne({ или: [ {emails.a: [email protected]}, {emails.b: [email protected]}, {emails.c: [email protected]}] }, function(err, документ) {}); Это сработало. Большое спасибо. - person Mahahari; 31.03.2014