Документ Mongo JSON - ›JSON -› BSON

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

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

Когда я вызываю 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.

Как я могу преобразовать его обратно в формат, который можно будет использовать для поиска на 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' } }

- Еще одно обновление РАЗРЕШЕНО ---

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

objectId = новый mongo.ObjectID.createFromHexString ('47cc67093475061e3d95369d'); предоставит _id, который я ищу.

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


person RobKohr    schedule 08.08.2010    source источник
comment
Итак, ваша проблема решена?   -  person Aillyn    schedule 08.08.2010
comment
Нет, настоящая проблема в том, что мне нужна какая-то форма идентификатора mongo, который я могу отправить в клиентский браузер (предпочтительно в json), который затем клиент может отправить обратно, который можно использовать для поиска объекта в mongodb.   -  person RobKohr    schedule 08.08.2010


Ответы (2)


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

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

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

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

findOne({_id: item._id}, collection)
person Niels van der Rest    schedule 08.08.2010
comment
Спасибо, теперь в этом больше смысла. Есть ли способ преобразовать этот объект в строку или более переносимый тип данных, а затем преобразовать его обратно? Мне нужно что-то отправить клиентскому браузеру, чтобы его можно было отправить обратно для идентификации объекта. - person RobKohr; 08.08.2010
comment
Вы должны отправить клиенту формат 4c3f23268ead0e8f14050000, поскольку это стандартное текстовое представление ObjectId. В оболочке Mongo toString () метод возвращает такую ​​строку. Я ожидаю, что это будет реализовано и в node-mongodb-native / node.js. - person Niels van der Rest; 08.08.2010
comment
Спасибо за вашу помощь! Нечто подобное было в составе библиотеки. - person RobKohr; 09.08.2010
comment
вы также можете выполнить JSON.stringify () в документе, содержащем экземпляр objectid, и он вызовет метод toJson для объекта, возвращающего шестнадцатеричное представление идентификатора объекта. - person christkv; 05.06.2011

Ну, я застрял с той же ошибкой при работе с клиентом python. Но уточню результат выполнения для обоих языков.

Сначала _id MongoDB возвращает объект BSON. Значение двоичной сериализации для JSON, подробнее в этой ссылке: BSON

Допустим, вы хотите вставить данные со следующими полями:

params = {
   "y":3,
   "favorite_color":"orange",
   "x":14766
}
client.connect(url, function(err, db) {
  var dbo = db.db("test_database");
dbo.collection("my_collection").insertOne(params, function(err, res) {
 if (err) throw err;
   console.log("inserted document",JSON.stringify(res));
    db.close();
   });
});

он возвращает результат объекта, например "_id":"5e95abf57b59b448bb22dedf"

Определяя ObjectId, вы можете легко использовать методы findOne, updateOne.

const {ObjectId} = require('mongodb');
client.connect(url, function(err, db) {
  var dbo = db.db("test_database");
 var myquery = { "_id": ObjectId("5e95abf57b59b448bb22dedf") } ;

    dbo.collection("my_collection").findOne(myquery, function(err, result) {
      if (err) throw err;
      console.log(result);
   });

});

Обновить:

client.connect(url, function(err, db) {
  var dbo = db.db("test_database");
   var myquery = { "_id": ObjectId("5e95abf57b59b448bb22dedf") } ;
    var newvalues = { $set: {favorite_color: "red", y: "14760" } };
    dbo.collection("my_collection").updateOne(myquery, newvalues, function(err, res) {
      if (err) throw err;
      console.log("1 document updated");
      db.close();
    });
});

Для питона:

возьмем для примера этот результат: {'_id':ObjectId('5e95a18dcae4a4a005e14bd8')}


from bson.json_util import loads as bson_loads, dumps as bson_dumps 
import json


#you should dump it then load it 
result = document = json.loads(bson_dumps(document))
{ "$set": {"status": False}}

#update:
db["my_collection"].update_one({ "_id": result},new_value)  

#find_one:
db["my_collection"].find_one({ "_id": resultjs})

Чтобы больше работать с клиентом Python MongoDB (мотором), я создал Gist

person Sabuhi Shukurov    schedule 14.04.2020