我在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)答案 0 :(得分:1)
没有详细记录,但如果您使用$pullAll
代替$pull
,则只删除完全匹配的元素:
db.test.update({}, {$pullAll:{a: [{b:1,c:2}]}});