如何保存MongoDB查询并在之后运行它?

时间:2017-05-03 17:27:18

标签: json node.js mongodb

我正在应用程序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将再次接受的对象?

2 个答案:

答案 0 :(得分:2)

使用MongoDB Extended JSON module

我们不应该像使用纯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);