2013-05-21 2 views
0

Итак, я пытаюсь выполнить запрос всех документов, имеющих город «Париж» и состояние «Франция». Мне нужно сделать какое-то соединение, но я не смог понять, как его построить.Как сделать запрос в нескольких вложенных полях данных в MongoDB

Я использую драйвер C#, но я с радостью принимаю помощь с помощью любого метода.

{ 
    "_id" : ObjectId("519b407f3c22a73a7c29269f"), 
    "DocumentID" : "1", 
    "Meta" : [{ 
     "Name" : "City", 
     "Value" : "Paris", 
    }, { 
     "Name" : "State", 
     "Value" : "France", 
    } 
    }] 
} 

{ 
    "_id" : ObjectId("519b407f3c22a73a7c29269g"), 
    "DocumentID" : "2", 
    "Meta" : [{ 
     "Name" : "City", 
     "Value" : "Paris", 
    }, { 
     "Name" : "State", 
     "Value" : "Texas", 
    } 
    }] 
} 

ответ

2

$elemMatch operator Используется для обозначения того, что все условия внутри него должны совпадать с одним и тем же элементом массива. Поэтому (чтобы переключиться на синтаксис оболочки), чтобы соответствовать все документы, которые имеют мета город Париж вы могли бы сделать

db.collection.find({Meta:{$elemMatch:{Name:"City",Value:"Paris"}}}) 

Это гарантирует, что Вы не совпадут то, что имеет имя: «somethingelse», значение: «Париж» где-то в его массив с другим элементом массива, соответствующим имени: «Город».

Теперь комбинация по умолчанию для объединения условий запроса является «и», так что вы можете продолжать добавлять атрибуты:

db.collection.find({Meta: { 
         $elemMatch:{Name:"City",Value:"Paris"}, 
         $elemMatch:{Name:"State",Value:"France"} 
     } 
    } 
) 

Теперь, если вы хотите добавить еще одно условие вы сохранить, добавив его, но если вы хотите нет, то вы сделайте это так:

db.collection.find({Meta: { 
         $elemMatch:{Name:"City",Value:"Paris"}, 
         $elemMatch:{Name:"State",Value:"France"}, 
         $not: {$elemMatch:{Name:"Arrondissement",Value:"Louvre"}} 
     } 
    } 
) 
0

Я может быть ответ на мой собственный вопрос здесь, но я новичок в MongoDB, поэтому в то время как это, кажется, чтобы дать мне результаты, я после того, как он не может быть оптимальным подходом.

var result = collection.Find(
    Query.And(
    Query.ElemMatch("Meta", Query.EQ("Name", "City")), 
    Query.ElemMatch("Meta", Query.EQ("Value", "Paris")), 
    Query.ElemMatch("Meta", Query.EQ("Name", "State")), 
    Query.ElemMatch("Meta", Query.EQ("Value", "France"))) 
    ); 

Что приводит к прослеживания - как бы я получить все документы, чей «Город» является «Париж» и «государство» является «Франция», но чей «Arrondissement» является не «Лувр» ?

+0

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

Смежные вопросы