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