mongodb как сделать запрос с помощью оператора nand?

Я использую $match агрегации. и я попробовал это.

    $match : { 
      $not: {
      'A': false,
      'B': 'condition'
      } 
    } 

но не работает как nand. это работает как не A и не B. Как я могу запросить Not (A и B)?


person yountae.kang    schedule 28.12.2013    source источник
comment
Запрос функции был открыт для логического оператора NAND, см. jira.mongodb.org/browse/SERVER -15577   -  person zamnuts    schedule 03.11.2014
comment
вы можете просто использовать $nor для этого.   -  person Asya Kamsky    schedule 10.10.2016


Ответы (4)


Оператор $not не инвертирует сложное выражение. Вам нужно использовать $and или $or для сложных выражений.

Используя логические правила, мы знаем, что следующие идентичны:

    not ( A and B ) = not A or not B

Используя язык запросов MongoDB, вы должны:

db.collection.find({$or:[{"a":{"$ne":false}},{"b":{"$ne":"condition"}}]})

OR simplifying the double boolean:

db.collection.find({$or:[{"a":true},{"b":{"$ne":"condition"}}]})

Используя структуру агрегации MongoDB, вы получите:

db.collection.aggregate([{"$match":{$or:[{"a":{"$ne":false}},{"b":{"$ne":"condition"}}]}}])

OR again, simplified to:

db.collection.aggregate([{"$match":{$or:[{"a":true},{"b":{"$ne":"condition"}}]}}])
person Daniel Coupal    schedule 06.01.2014

Это должно принести вам результаты

{
    $or: [
        {'a': { $ne: 1} },
        {'b': { $ne: 2} }
    ]
}

Однако это выражение не дало желаемого результата в моем случае, поэтому я попробовал это:

{
     $nor: [
       {
         $and: [
             {a: 1},
             {b: 2}
         ]
       }
    ]
}
person mohakjuneja    schedule 23.09.2017

есть очень простой трюк для создания NAND с mongoDB:

$nor : { $and [..., ...] }
person DaniPaniz    schedule 22.08.2020

вы можете думать иначе в mongodb с доступными опциями.

db.Collection.find({'arrary.a':{$exists:false},'arrary.b':{$exists:false}})

Надеюсь, что это поможет вам...

person nish71    schedule 28.12.2013
comment
извините, я не могу этого понять. Можете ли вы объяснить, что такое $exists? - person yountae.kang; 28.12.2013
comment
означает, что это приведет к тем документам, в которых нет полей A и B. - person nish71; 28.12.2013
comment
Мой вопрос не о существовании, а о соответствии определенному значению. - person yountae.kang; 28.12.2013
comment
так что вы можете сделать так db.inventory.find({A: {$ne: false},B:{$ne:condition}) - person nish71; 28.12.2013