【问题标题】:Output NodeJS / MongoDB Query to String Runnable in Console在控制台中将 NodeJS / MongoDB 查询输出到 String Runnable
【发布时间】:2020-01-05 17:04:02
【问题描述】:

在 NodeJS 中,我有一个带有 ObjectID 的聚合 MongoDB 查询。我只是试图将查询输出到字符串(例如 console.log),以便我可以将其复制/粘贴到控制台并手动运行查询。

我在查询本身上找不到任何方法,所以我在管道 json 上执行 console.log。

console.log(JSON.stringify(pipeline));

哪些输出:

[{"$match":{"$and":[{"users.userId":{"$eq":{"_bsontype":"ObjectID","id":{"type":"Buffer","data":[93,151,104,127,56,207,132,25,197,44,232,49]}}}},{"users.userId":{"$eq":{"_bsontype":"ObjectID","id":{"type":"Buffer","data":[93,151,104,127,56,207,132,25,197,44,232,49]}}}}]}}]

这是我希望在控制台中成功运行的结果:

[{"$match":{"$and":[{"users.userId":{"$eq":ObjectId("5d97687f38cf8419c52ce831")}},{"users.userId":{"$eq":ObjectId("5d97687f38cf8419c52ce831")}}]}}]```

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    如果你使用 mongodb 的原生客户端 for node.js 那么,

    按照 mongodb client for node 的官方文档 (http://mongodb.github.io/node-mongodb-native/3.4/reference/connecting/connection-settings/),

    您可以使用 mongodb 的 "loggerLevel" 连接选项来打印查询。

    
    const MongoClient = require('mongodb').MongoClient;
    const assert = require('assert');
    
    // Connection URL
    const url = 'mongodb://localhost:50000,localhost:50001';
    // Database Name
    const dbName = 'myproject';
    
    // create a client, passing in additional options
    // loggerLevel: debug will print all query on the console
    const client = new MongoClient(url, {
      poolSize: 10, tls: true
      loggerLevel: debug 
    });
    
    // Use connect method to connect to the server
    client.connect(function(err) {
      console.log("Connected correctly to server");
    });
    
    

    else 如果您正在使用任何用于 mongoDB 的 ORM,例如 mongoose (https://mongoosejs.com/docs/connections.html),那么,

    使用 mongoose.set('debug', true) 将在控制台上打印查询,

    
    
    const mongoose = require('mongoose')
    const { mongo, env } = require('./vars')
    
    // Exit application on error
    mongoose.connection.on('error', (err) => {
      console.error(`MongoDB connection error: ${err}`)
      process.exit(-1)
    })
    
    // print mongoose logs in dev env
    if (env === 'development') {
      mongoose.set('debug', true)
    }
    
    /**
    * Connect to mongo db
    */
    const connect = async () => {
      await mongoose.connect(mongo.uri, {
        socketTimeoutMS: 60000,
        keepAlive: true,
        useMongoClient: true,
        reconnectTries: 60000,
        poolSize: 10
      })
      return mongoose.connection
    }
    
    exports.connect = connect
    
    

    【讨论】:

      【解决方案2】:

      问题是 ID 被存储为 BSON,它显然有一个独特的序列化程序。如果您希望以与 MongoDB 命令行兼容的方式对这些进行序列化,则需要一个自定义序列化程序来转换 ID 值。

      JSON.stringify 有一个 replacer 函数,您可以将其应用于每个键,我现在无法对此进行测试,但我认为这会起作用:

      JSON.stringify(pipeline, (k, v) => {
        if (k === '$eq') {
          return v.toString()
        }
        return v;
      })
      

      这不会直接给你ObjectId('...') 的值(我认为应该没问题)。

      【讨论】:

        猜你喜欢
        • 2015-05-09
        • 1970-01-01
        • 2021-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-26
        • 1970-01-01
        • 2013-02-22
        相关资源
        最近更新 更多