2014-09-03 4 views
2

У меня есть Монго БД с данными, хранящимися в этом формате:Монго запрос для объектов с отсутствующими ключ

{ "_id" : ObjectId("53e27f602041f3c6fe5373a8"), 
    "miles" : 112650, 
    "history" : [ { "date" : ISODate("2014-05-26T00:00:00Z"), "price" : 8995 }, 
       { "date" : ISODate("2014-06-01T00:00:00Z"), "price" : 8995 } ] } 

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

{ "_id" : ObjectId("53e27f602041f3c6fe5373a8"), 
    "miles" : 112650, 
    "history" : [ { "date" : ISODate("2014-05-26T00:00:00Z"), "price" : 8995 }, 
       { "date" : ISODate("2014-06-01T00:00:00Z")} ] } 

I нужно запросить db, чтобы найти 1) все объекты, в которых каждая запись в массиве истории имеет дату и цену, и 2) все объекты wh если в массиве истории есть запись «дата», которая не соответствует записи «цена». Спасибо за вашу помощь!

ответ

2

Ответ на вопрос «2» сначала по причинам, которые станут ясными, то, что вы в основном просите, это найти документы, элементы массива которых содержат значение «дата», но не «цена». Поскольку существует два условия для соответствия элемента массива $elemMatch. И, чтобы проверить наличие поля, которое вы хотите $exists так:

db.collection.find({ 
    "history": { 
    "$elemMatch": { 
     "date": { "$exists": true }, 
     "price": { "$exists": false } 
    } 
    } 
}) 

Это возвращает свой второй образец, так как один из элементов массива не имеет «цену».

Для того, чтобы ответить на «1», это в основном только обратной логики выше, так что все вы приведете здесь является $not оператор:

db.collection.find({ 
    "history": { 
    "$not": { 
     "$elemMatch": { 
     "date": { "$exists": true }, 
     "price": { "$exists": false } 
     } 
    } 
    } 
}) 

Это производит первый документ в образце так как в этом случае «цена» существует во всех элементах, и поэтому заявленное условие будет false, но это обернется, используя $not.

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