121

日付フィールドを持つEmailドキュメントがあります:sent_at

{
  'sent_at': Date( 1336776254000 )
}

これEmailが送信されていない場合、sent_atフィールドはnullであるか、存在しません。

すべての送信済み/未送信のカウントを取得する必要がありますEmails。私はこの情報を照会する正しい方法を見つけようとして立ち往生しています。これが送信数を取得する正しい方法だと思います。

db.emails.count({sent_at: {$ne: null}})

しかし、送信されなかったものの数をどのように取得する必要がありますか?

4

9 に答える 9

201

sent_atフィールドが設定されていないときにフィールドが存在しない場合は、次のようにします。

db.emails.count({sent_at: {$exists: false}})

そこにあり、nullの場合、またはまったくない場合:

db.emails.count({sent_at: null})

それがそこにあり、nullの場合:

db.emails.count({sent_at: { $type: 10 }})

MongoDBマニュアルの「ヌルまたは欠落フィールドのクエリ」セクションでは、ヌル値と欠落値をクエリする方法について説明しています。

平等フィルター

{ item : null }クエリは、値がであるかフィールドを含まないアイテムフィールドを含むドキュメントと一致null ますitem

db.inventory.find( { item: null } )

存在チェック

次の例では、フィールドを含まないドキュメントをクエリします。

クエリは、フィールド{ item : { $exists: false } }を含まないドキュメントと一致します。item

db.inventory.find( { item : { $exists: false } } )

タイプチェック

{ item : { $type: 10 } }クエリは、値が;であるフィールドを含むドキュメントのみに一致します。つまり、アイテムフィールドの値はBSONタイプ(タイプ番号)です:itemnull Null10

db.inventory.find( { item : { $type: 10 } } )
于 2012-05-14T21:55:02.540 に答える
19

sent_at値が定義されているドキュメントのみをカウントする場合null(設定されていないドキュメントはカウントしないでくださいsent_at):

db.emails.count({sent_at: { $type: 10 }})
于 2016-01-17T03:46:43.493 に答える
16

使用する:

db.emails.count({sent_at: null})

これは、sent_atプロパティがnullまたは設定されていないすべての電子メールをカウントします。上記のクエリは以下と同じです。

db.emails.count($or: [
  {sent_at: {$exists: false}},
  {sent_at: null}
])
于 2017-04-06T07:03:23.840 に答える
10

あなたはただ一行をすることができるようです:

{ "sent_at": null }
于 2015-04-07T11:04:03.803 に答える
1

上記のすべての答えは素晴らしく、正しいです。を使用している回答に1つの改善を追加したいだけです$type

MongoDB 3.2以降では、使用を回避でき10(ハードコードされたリテラルはコードの可読性を低下させるため)、代わりに文字列エイリアスを使用できます"null"。要約すると-

sent_at1.存在し、値を持つレコードを選択する場合null

db.emails.count({sent_at: { $type: 'null' }});

// or
// This reduces the code readability as your peer might not know
// that what is the meaning of value 10
db.emails.count({sent_at: { $type: 10 }});

sent_at: null2.存在する、またはsent_at存在しないレコードを選択する場合

// This will ensure both the conditions
db.emails.count({ sent_at: null })

sent_at3.存在しないレコードのみが必要な場合

db.emails.count({sent_at: { $exists: false }});

sent_at4.フィールドが存在し、任意の値を持つ可能性がある場所のみを選択する場合

db.emails.count({sent_at: { $exists: true }});

これにより、、、、などのemails値を持つすべてのドキュメントがプルされることを忘れないでください。null0''false

于 2021-09-28T08:27:13.817 に答える
0

これを試すこともできます:

db.emails.find($and:[{sent_at:{$exists:true},'sent_at':null}]).count()
于 2019-08-11T17:31:40.410 に答える
0

$in演算子を使用して両方のケースをチェックできます

db.emails.find({"sent_at": {$in:[null,""]}).count()
于 2021-06-10T13:11:42.553 に答える
0

必要な場合は、同じドキュメント内で属性と値がnullに等しいかどうかを確認してください。

db.emails.count($or: [
  {sent_at: {$exists: false}},
  {sent_at: null}
]) 

上記は1行で実行できます-クエリは次のように時間がかかりません-

db.emails.count($or: [ {sent_at: nil }])

値に加えてnilキーもである場合、ドキュメントをフェッチするためです。ソースを一瞥する方が、私の一日を節約できました。doesn't existnull

注:mongodbの新しいバージョンではnilなくを使用してください。null

于 2021-11-16T13:37:06.643 に答える
-1
db.employe.find({ $and:[ {"dept":{ $exists:false }, "empno": { $in:[101,102] } } ] }).count();
于 2020-09-10T15:49:23.947 に答える