2014-01-31 3 views
1

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

Это то, что я могу сделать на поддокументах

> db.test.insert({a:{b:1,c:2}}); 
> db.test.insert({a:{b:1}}); 
> db.test.find({'a.b':1}); // non exact match 
{a:{b:1,c:2}} 
{a:{b:1}} 
> db.test.find({'a':{'b':1}}); // exact match 
{a:{b:1}} 

я хотел бы сделать то же самое на основном документе (не поддокумент). Но

> db.test.insert({b:1,c:2}); 
> db.test.insert({b:1}); 
> db.test.find({'b':1}); // non exact match 
{a:{b:1,c:2}} 
{a:{b:1}} 
> db.test.find({'.':{'b':1}}); // does not work :(
> db.test.find({'b':1, 'c':null}); // works, but how I am supposed to know that 'c' could exists ??? 
{a:{b:1}} 

Конечная цель состоит в том, чтобы сделать это с помощью $pull массивов

> db.test.insert({a:[{b:1,c:2},{b:1,d:3},{b:1,c:2},{b:1,c:2,d:3}]}); 
> db.test.update({}, {$pull:{'a':{b:1,c:2}}}); 
> db.test.find(); 
{a:[{b:1,d:3}]} // NOOOO :'(

Кто-нибудь представление об этом?

редактировать:

Вот некоторые точности по точному/частичному совпадению я нашел на массивах:

  • элемента массива точного совпадения: db.test.find({'a':{b:1,c:2}});
  • элемента массива частичного соответствие: пункт db.test.find({'a':{$elemMatch:{b:1,c:2}}});
  • массива удаление частичное совпадение: db.test.update({}, {$pull:{'a':{b:1,c:2}}})
  • массив item удаление точное совпадение: db.test.update({}, {$pullAll:{'a':[{b:1,c:2}]}}) (благодаря JohnnyHK)
+0

Не могли бы вы переименовать этот вопрос «MongoDB удалить документ из массива, который является точным совпадением "или что-то в этом роде? Я искал ответ на ваш первоначальный вопрос и был разочарован тем, что фактический вопрос касался массивов. Спасибо! FYI людям, которые приходят сюда, ища ответы на начальный вопрос: http://stackoverflow.com/questions/27993275/how-to-exact-match-entire-document –

ответ

1

Это не хорошо документированы, но если вы используете $pullAll вместо $pull, только точно соответствующие элементы удаляются:

db.test.update({}, {$pullAll:{a: [{b:1,c:2}]}}); 
+0

Wow youre right! Странное поведение ... но спасибо –

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