6

私は以下の文書を持っています

> db.people.insert({name: "Bob"})
> db.people.insert({name: 42})

タイプで検索する必要がある場合は、String次を使用できます。

> db.people.find({name: { $type: 2 })

ここで、2は文字列のタイプ番号です。

しかし、どうすればタイプで見つけることができますNumberか?

> typeof db.people.findOne({name: 42}).name
number

可能なタイプnumberにはタイプがありません。

upd:16と18のタイプで見つけようとしました。動作しません。

> db.people.find({ name: 42 })
{ "_id" : ObjectId("509645ae5013826ee61d96ac"), "name" : 42 }
> db.people.find({name: { $type: 16 }})
> db.people.find({name: { $type: 18 }})
4

2 に答える 2

9

JavaScript には数値型が 1 つしかなく( Number)、IEEE 754 浮動小数点数 (double) としてバイナリで表されます。

BSON 仕様では、これは double (タイプ 1) として表されるため、次のように検索できるはずです。

db.people.find({name: { $type: 1 }})

mongo異なる BSONデータ型を挿入する場合は、いくつかのシェル ヘルパーがあります。

42              // Type 1:  double (64-bit IEEE 754 floating point, 8 bytes)
NumberInt(42)   // Type 16: int32  (32-bit signed integer, 4 bytes)
NumberLong(42)  // Type 18: int64  (64-bit signed integer, 8 bytes)

たとえば、次のようになります。

db.people.insert({ name: 'default', num: 42 })
db.people.insert({ name: 'NumberLong', num: NumberLong(42) })
db.people.insert({ name: 'NumberInt', num: NumberInt(42) })

find()複数の形式で表現できる数値 (つまり、32 ビット整数は double または int64 として表現することもできます) に対してを実行すると、さまざまな数値表現が一致します。

例えば:

db.people.find({num:42})
{
    "_id" : ObjectId("50965aa3038d8c8e85fd3f45"),
    "name" : "default",
    "num" : 42
}
{
    "_id" : ObjectId("50965aa3038d8c8e85fd3f46"),
    "name" : "NumberLong",
    "num" : NumberLong(42)
}
{
    "_id" : ObjectId("50965aa3038d8c8e85fd3f47"),
    "name" : "NumberInt",
    "num" : 42
}

ただし、 で見つかった$type場合、BSON 表現は異なります。

> db.people.find({num: { $type: 1 }})
{
    "_id" : ObjectId("50965aa3038d8c8e85fd3f45"),
    "name" : "default",
    "num" : 42
}

> db.people.find({num: { $type: 16 }})
{
    "_id" : ObjectId("50965aa3038d8c8e85fd3f47"),
    "name" : "NumberInt",
    "num" : 42
}

> db.people.find({num: { $type: 18 }})
{
    "_id" : ObjectId("50965aa3038d8c8e85fd3f46"),
    "name" : "NumberLong",
    "num" : NumberLong(42)
}
于 2012-11-04T12:13:23.693 に答える
0

javascript では、int32 と int64 の間に実際の違いはありません。ただし、Mongodb シェルは、特に明記しない限り (Number(..) コンストラクターを使用して) 32 ビットを使用します。

次のようにクエリを実行する必要があります。

db.people.find({name: { $type: 16 })

ここで、16 は整数の型コードです: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24type

于 2012-11-04T11:24:34.663 に答える