Монго документ JSON -> JSON -> BSON - PullRequest
2 голосов
/ 08 августа 2010

Я работаю с Node.js для создания сервера веб-сокетов, который использует mongodb.

Я использую node-mongodb-native в качестве библиотеки для доступа к базе данных mongo.

Когда я вызываю console.log (sys.inspect (item)) для объекта из базы данных, которую я получаючто-то похожее на это:

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

, поэтому я предполагаю, что id - это идентификатор объекта BSON, который использует mongo.

Мне нужно отправить этот объект в веб-браузер клиента с помощью JSON,попросите их кое-что сделать, а затем отправить их обратно на сервер.

Когда я JSON.stringify (item), я получаю что-то похожее на это:

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

Таким образом, идентификатор был преобразован в некоторую строку в шестнадцатеричном коде.Если я отправляю его клиенту, а клиент отправляет его обратно, мне нужно обновить его в базе данных.Я запускаю JSON.parse (item), чтобы он стал нормальным объектом, но он все равно выглядит так:

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

, и этот _id нельзя использовать для поиска в mongodb.

Как я могу преобразовать его обратно в формат, который можно будет использовать для поиска на монго?

- обновление -

Интересно, я могу использовать 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' } }

- Другое обновление RESOLVED ---

Произошли некоторые манипуляции с идентификатором объекта в файле интеграционного теста.

objectId = new mongo.ObjectID.createFromHexString ('47cc67093475061e3d95369d');выдаст искомый _id.

objectId.toHexString () вернет шестнадцатеричную строку, которая выглядит как '47cc67093475061e3d95369d'

1 Ответ

1 голос
/ 08 августа 2010

Я предполагаю, что sys.inspect интерпретирует ObjectId как объект, содержащий свойство id.Вот что вы видите в дампе.

MongoDB обрабатывает ObjectId как 12-байтовое двоичное значение, а не как объект.Таким образом, MongoDB не знает ни о каком id свойстве.Вот почему следующий запрос не дает результата:

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

Следующее работает, так как оно просто обрабатывает оба значения как двоичные значения:

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