0

時折、javascript が科学表記法として解釈できる _id 値を持つドキュメントを取得します。

次のクエリを実行した問題のみを示します。

db.users.find({$where:'this._id > 1'}).count()

2

このコレクションには何百ものドキュメントがありますが、数値として評価されるこれら 2 つは、{$in:[]} 句で使用されると問題を引き起こします。

db.users.findOne({$where:'this._id > 1'})._id

ObjectId("5225141850742e0000002331") - 科学表記法のようですね。

その _id を別のコレクションに文字列として保存したい場合、次のように言うと問題が発生すると思います

friendsCollection: { _uid:"5225141850742e0000002331" //その他のプロパティはこちら }

その値を取得すると、Node (または Mongoose) はそれを "Infinity" のような数値として解釈します。次に、私のコードは、エラーをスローする {_id:{$in:[Infinity]}} でユーザーを検索しようとします。

_id 値を保存したり、_id であることがわかっているプロパティを処理したりするためのより堅牢な方法があると思いますが、その方法はわかりません。

4

3 に答える 3

0

ああ、スキーマで Mongoose データ型「ObjectId」を使用する必要があるかもしれません。

たとえば、次のようなマングース スキーマを使用していました。

locations:{
    _uid:{type:String},//<--probably not good
    lat:{type:Number},
    lng:{type:Number}
},

スキーマ タイプ「ObjectId」の使用を開始:

locations:{
    _uid:Schema.Types.ObjectId,//<--better?
    lat: {type:Number},
    lng: {type:Number}
},

この変更をサポートするには、多くのデータを再構築する必要があります。また、それらの科学表記法 _ids の別の 1 つがポップアップするまで、私は確信が持てません (問題のあるドキュメントを削除しました)。ただし、これは有望です。

于 2013-09-12T15:43:11.177 に答える
0

ある時点で、ネイティブ ドライバーを使用して _id をクエリするときに問題が発生しました。クエリで ObjectId を使用して修正しました。これが役に立つかもしれません:

var ObjectId = require("mongodb").ObjectID;

query._id = { $gt: ObjectId(idString) }
于 2013-09-05T06:38:14.600 に答える