Найти документы, где значение не равно нулю

У меня есть следующая структура документа

{
    "model" : {

    },
    "_id" : ObjectId("538df963d1c3f82329000257"),
    "email" : "[email protected]",
    "name" : "sam",
    "endpointarn" : "arn:aws:sns:us-east-1:284585229836:endpoint/GCM/Positivethinking/59eb7c66-c13c-3e44-af80-0b1f4f7ea9fd",
    "devregidtoken" : "APA91bFMOBo6ZWemMAG5clKEd5VYVvbeDOM5zNXjbbl3faSE0FZt3gtJYv0hpjdWuOY-mvr-k3sCcq0dEveCM6jx5mOh1u6JEubuUmKb2zU64dn_A4gJ4pCBG7AGQJ8DnkO83Ca4wgzsoJcio9T-TtA",
    "topicsubs" : [
        {
            "topicsubid" : "arn:aws:sns:us-east-1:284585229836:Wealth-ProsperityQuotes:5f3e8060-48fa-4a8e-bdc3-e9596747da1a",
            "topicname" : "Wealth-Prosperity",
            "topicno" : 0
        }
    ],
    "timecreated" : ISODate("2014-06-03T16:35:47.442Z"),
    "purchasedata" : {
        "orderid" : "111",
        "packagename" : "",
        "productid" : "",
        "purchasetime" : "",
        "purchasestate" : "",
        "developerpayload" : "",
        "purchasetoken" : ""
    },
    "ccode" : "",
    "ccodestat" : ""
}

Я хочу получить все документы, где purchaseata.orderid не является NULL. Я пробовал

db.User.find({"purchasedata.orderid" : {$ne : ""}});

Ответ 1

Если вы проверяете null, вы можете использовать $ne:

db.User.find({
   "purchasedata.orderid" : { $ne : null }
});

Старый ответ:

OP первоначально хотел проверить, что значение не является пустой строкой ", а не нулевой. null и пустая строка - это два разных типы BSON. Вы можете использовать $type и $not операторам проверьте, где значение null и что ключ существует:

db.User.find({
   "purchasedata.orderid" : { 
      $not : { $type : 10 }, 
      $exists : true
   }
});

Оператор $type выбирает документы, где это значение является конкретным типом BSON (10 соответствует null). $exists проверяет наличие ключа в поддокументе.

Ответ 2

Ты был очень близок. Если значение действительно пустое, вы можете просто использовать "null" вместо пустого.

db.User.find({"purchasedata.orderid" : {$ne : null}});

Ответ 3

Итак, вот что, наконец, помогло мне

db.User.find({
   "purchasedata.orderid" : {
      $exists : true,
      $ne : ""
   }
});

@Christian p был близок, поэтому я проголосовал, но я думаю, что моя проблема заключалась в том, что значение не было нулевой обратно на самом деле пустой строкой, а также проверяет, действительно ли значение существует