我正在应用程序A 中安装MongoDB查询。例如:
const query = { country: new ObjectId(""), age: { $gte: 25 } }
// save contents of 'query'
...我想在de DB中保存它并使应用程序B 运行它:
// const query = read object from the database
db.collection('foo').find(query).toArray()...
我想现在将它保存在mongo中并在稍后的时间段内检索它以运行。但MongoDB不允许我保存$gte
值的文档。我已经尝试JSON.stringify(query)
,将结果字符串保存在数据库中(确定!),然后在另一端解析它。
然后,遇到ObjectId
像这样被字符串化的问题:
{
"class" : "org.bson.types.ObjectId",
"counter" : 9053980.0,
"date" : "2015-04-01T19:24:39Z",
"machineIdentifier" : 14987412.0,
"processIdentifier" : 29601.0,
"time" : 1427916279000.0,
"timeSecond" : 1427916279.0,
"timestamp" : 1427916279.0
}
解析的JSON不是有效的ObjectId。它只是一个JS对象。
如何保存MongoDB查询并将其解析为mongo将再次接受的对象?
答案 0 :(得分:2)
我们不应该像使用纯Javascript对象那样对MongoDB对象进行字符串化和解析。
要解析MongoDB对象,我们必须使用Mongodb-Extended-JSON模块。由于有些类型无法解析为纯JSON,因此Mongo将其对象转换为特殊的JSON(扩展JSON)。
关于应用A :
const EJSON = require('mongodb-extended-json')
const query = { country: new ObjectId(""), age: { $gte: 25 } }
const strQuery = EJSON.stringify(query)
// { "country": { "$oid": "5422c2e6e4b02fd68a01225c" }, "age": { "$gte": 25 } }
关于申请B :
const EJSON = require('mongodb-extended-json')
const query = EJSON.parse(strQuery)
const query = EJSON.stringify(query)
// query is now a MongoDB Object that can be used on db.collection('foo').find(query)
答案 1 :(得分:1)
尝试使用ObjectId
将.toString()
转换为字符串,然后在反序列化时将字符串转换回适当的ObjectId
:
const ObjectId = require('mongodb').ObjectId;
let query = {
country: new ObjectId('590a0953ca81dd490ee8dba3'),
age: {
$gte: 25
}
};
query.country = query.country.toString();
const serialized = JSON.stringify(query);
console.log(serialized);
let deserialized = JSON.parse(serialized);
deserialized.country = new ObjectId(deserialized.country);
console.log(deserialized);