我想找到数组fieldB在fieldC对象中没有值(val1和val2)的所有结果。
我试过了:
db.SalesToImport
.find(
{
fieldA: {$exists:true},
,fieldB: {$not: {$elemMatch: {fieldC: 'val1'}}}
,fieldB: {$not: {$elemMatch: {fieldC: 'val2'}}}
}
);
我试过了:
db.SalesToImport
.find(
{
fieldA: {$exists:true},
,fieldB: {$not: {$elemMatch: {fieldC: 'val1', fieldC: 'val2'}}}
}
);
它们都产生相同的结果,虽然它们删除了一些文档,但仍有文档中包含val1
和val2
,这告诉我我的查询不正确。
文档的结构包含如下字段:
{
fieldA: value,
fieldB: [
{fieldC:value1, fieldD:value3, fieldE:value5},
{fieldC:value2, fieldD:value4, fieldE:value6}
]
}
如何在MongoDB查询中将$ elemMatch与$ nin或$ not组合以获得所需的效果?
根据建议,我运行了以下实际但已消毒的查询:
db.SalesToImport
.find(
{
calculatedTaxRate: {$exists:true}, unidentifiedProducts: {$exists:false}, unidentifiedCustomer: {$exists:false},
register_sale_payments: {
$elemMatch: {
retailer_payment_type_id : {
$nin: [
'0af7b240-ab24-11e7-eddc-9fff6de134e9'
,'0af7b240-ab24-11e7-eddc-9fff69293826'
]
},
}
}
},
{_id:0,status:0,customer_id:0,register_id:0}
)
.sort({"calculatedTaxRate":1});
但是回复仍然在fieldB.fieldC
或register_sale_payments.retailer_payment_type_id
中产生了不需要的结果,所以这不是我想要的,或者我在使用它时犯了错误。
根据建议,我运行了以下实际但已消毒的查询:
db.SalesToImport
.find(
{
calculatedTaxRate: {$exists:true}, unidentifiedProducts: {$exists:false}, unidentifiedCustomer: {$exists:false},
'register_sale_payments.retailer_payment_type_id': {
$nin: [
'0af7b240-ab24-11e7-eddc-9fff6de134e9'
,'0af7b240-ab24-11e7-eddc-9fff69293826'
]
}
},
{_id:0,status:0,customer_id:0,register_id:0}
)
.sort({"calculatedTaxRate":1});
它有效!
答案 0 :(得分:3)
虽然您只对fieldB
的一个字段感兴趣,但您不需要使用$elemmatch
。
db.SalesToImport.find(
{
"fieldA": {$exists:true},
"fieldB.fieldC": { $nin: ["val1", "va2"] }
}
);
如果您在fieldB
中有一个fieldD,例如,您不希望fieldD具有值val3,val4:
db.SalesToImport.find(
{
"fieldA": { $exists: true },
"fieldB.fieldC": { $nin: ["val1", "va2"] },
"fieldB.fieldD": { $nin: ["val3", "va4"] }
}
);
上面的查询排除了fieldC,fieldD对的文档,如下所示:(val5,val3),因为我们分别查询fieldC和fieldD。
如果要查询fieldB
没有fieldC和fieldD(val1,val3),(val1,val4),(val2,val3),(val2,val4)的值对:
db.SalesToImport.find(
{
"fieldA": { $exists: true },
"fieldB": { $elemmatch: {
"fieldC" : { $nin: ["val1", "val2"] },
"fieldD": { $nin: ["val3", "val4"] } }
}
}
);
以上查询不排除filedC,fieldD对,如:(val5,val3)