如何在MongoDB查询中将$ elemMatch与$ nin或$ not组合?

时间:2017-09-23 03:58:35

标签: mongodb mongodb-query

我想找到数组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'}}}
    }
  );

它们都产生相同的结果,虽然它们删除了一些文档,但仍有文档中包含val1val2,这告诉我我的查询不正确。

文档的结构包含如下字段:

{
  fieldA: value,
  fieldB: [
    {fieldC:value1, fieldD:value3, fieldE:value5},
    {fieldC:value2, fieldD:value4, fieldE:value6}
  ]
}

如何在MongoDB查询中将$ elemMatch与$ nin或$ not组合以获得所需的效果?

更新#1

根据建议,我运行了以下实际但已消毒的查询:

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.fieldCregister_sale_payments.retailer_payment_type_id中产生了不需要的结果,所以这不是我想要的,或者我在使用它时犯了错误。

更新#2

根据建议,我运行了以下实际但已消毒的查询:

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});

它有效!

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)