2

Node.js を使用して、mongodb を使用する Web ソケット サーバーを構築しています。

mongo db にアクセスするためのライブラリとして node-mongodb-native を使用しています。

データベースからオブジェクトに対して console.log(sys.inspect(item)) を呼び出すと、次のような結果が得られます。

{ _id: { id: 'L?#&\u008e\u00ad\u000e\u008f\u0014\u0005\u0000\u0000' }
, y: 3
, favorite_color: 'orange'
, x: 14766
}

したがって、IDはmongoが使用するBSONオブジェクトIDであると推測しています。

このオブジェクトを JSON を使用してクライアントの Web ブラウザーに送信し、何らかの操作を行ってから、サーバーに送り返す必要があります。

JSON.stringify(item) を実行すると、次のような結果が得られます。

{"_id":"4c3f23268ead0e8f14050000","y":3,"favorite_color":"orange","x":14766}

そのため、ID は 16 進数でエンコードされた文字列に変換されています。それをクライアントに送信し、クライアントがそれを返送した場合、データベースで更新する必要があります。JSON.parse(item) を実行して通常のオブジェクトにしますが、それでも次のようになります。

{ _id: '4c3f23268ead0e8f14050000'
, y: 3
, favorite_color: 'orange'
, x: 14766
}

その _id を使用して mongodb を検索することはできません。

mongo でのルックアップに使用できる形式に変換するにはどうすればよいですか?

- アップデート -

興味深いことにfindOne({_id:item._id}, collection)、ドキュメントを取得するために使用できますが、これを行うと:

findOne({_id:{id : item._id.id}}, collection)

結果が届きません。mongo _id オブジェクトには何か特別なものがあると思います。

{_id:item._id}と をダンプすると、次の {_id:{id : item._id.id}} ようになります。

{ _id: { id: 'L?#&\u008e\u00ad\u000e\u008f\u0014\u0005\u0000\u0000' } }

--別の更新が解決されました---

統合テスト ファイルにオブジェクト ID の操作がありました。

objectId = 新しい mongo.ObjectID.createFromHexString('47cc67093475061e3d95369d'); 私が探している_idを提供します。

objectId.toHexString() は、「47cc67093475061e3d95369d」のような 16 進文字列を返します。

4

2 に答える 2

1

私の推測では、これはObjectIdをプロパティを含むオブジェクトとしてsys.inspect解釈します。それがあなたがダンプで見ているものです。id

MongoDB は、ObjectId をオブジェクトとしてではなく、12 バイトのバイナリ値として扱います。そのため、MongoDB はどのidプロパティについても知りません。そのため、次のクエリでは結果が得られません。

findOne({_id: {id: item._id.id}}, collection)

以下は、両方の値をバイナリ値として扱うだけなので、機能します。

findOne({_id: item._id}, collection)
于 2010-08-08T16:15:44.767 に答える