mongodb找到确切的文件

时间:2014-01-31 16:50:37

标签: mongodb find pull

我在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}}})
  • 数组项目删除完全匹配:db.test.update({}, {$pullAll:{'a':[{b:1,c:2}]}})(感谢JohnnyHK)

1 个答案:

答案 0 :(得分:1)

没有详细记录,但如果您使用$pullAll代替$pull,则只删除完全匹配的元素:

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