【问题标题】:How to add binary data with objectId to mongoDB?如何将带有objectId的二进制数据添加到mongoDB?
【发布时间】:2016-08-09 12:23:15
【问题描述】:

我需要将一个文档插入到集合中,该集合具有 ObjectIdBinData 值。所以不知道怎么插入。

使用此代码,我收到错误 TypeError: Cannot read property 'ObjectId' of undefined

server/fixtures.js

var ObjectId = Mongo.ObjectID;
var chunk = {
            "_id"     : ObjectId("57a9be3c89c1e4b50c574e3a"),
            "files_id": ObjectId("5113b0062be53b231f9dbc11"),
            "n"       : 0,
            "data"    : BinData(0, "/9j/4AAQSkZJRgA...and...so...on../2Q==")
        };

db.mediafiles.chunks.insert(chunk);

更新

我正在使用 Meteor

因此我可以使用var ObjectId = Meteor.Collection.ObjectID;。但是我如何获得BinData

ReferenceError: BinData is not defined

【问题讨论】:

  • 你是从 Mongo shell 运行这个吗?
  • 没有。一个服务器端的 JS 文件
  • 在我发布答案之前要清楚,您使用的是 NodeJS(服务器端 JS)吗?
  • @notionquest 我正在使用基于 NodeJS 的 Meteor。
  • @user3142695 你找到答案了吗?

标签: javascript mongodb meteor insert objectid


【解决方案1】:

今天也偶然发现了这个。

正如提到的另一个答案,您可以使用 MongoDB 驱动程序提供的 ObjectIDBinary。我遇到的问题是二进制数据不是我在插入后所期望的,这是由于Binary 函数的内部工作原理。它需要一个未编码的字符串或一个缓冲区,可以从 base64 编码的内容初始化,如下所示:

const { Binary, ObjectID } = require('mongodb')

async function run() {
  // Configure MongoDB connection
  const client = new MongoClient()

  // Connect to MongoDB
  await client.connect(...)

  try {
    // Insert data using base64 encoded content and 
    // both ObjectID and Binary from mongodb package
    await client.db().mediafiles.chunks.insert({
      _id: ObjectID('57a9be3c89c1e4b50c574e3a'),
      files_id: ObjectID('5113b0062be53b231f9dbc11'),
      n: 0,
      data: Binary(Buffer.from('/9j/4AAQSkZJRgA...and...so...on../2Q==', 'base64')),
    })
  } finally {
    // Close client if it was opened
    await client.close()
  }
}

【讨论】:

    【解决方案2】:

    这是将数据插入集合的 NodeJS 代码。要具体回答您的问题,如果您使用的是 NodeJS,则需要以下语句。

    var ObjectId = require('mongodb').ObjectID;
    

    完整的 NodeJS 代码(假设您使用的是 NodeJS):-

    var Db = require('mongodb').Db, MongoClient = require('mongodb').MongoClient;
    var assert = require('assert');
    var ObjectId = require('mongodb').ObjectID;
    
    var bindata = new require('mongodb').Binary("ZzEudm1s");
    
    var insertDocument = function(db, callback) {
        var chunk = {
            "_id" : new ObjectId("535e1b88e421ad3a443742e7"),
            "files_id" : new ObjectId("5113b0062be53b231f9dbc11"),
            "n" : 0,
            "data" : bindata
        };
    
        db.collection('Day1').insertOne(chunk, function(err, result) {
            assert.equal(err, null);
            console.log("Inserted a document into the collection.");
            callback();
        });
    };
    
    MongoClient.connect('mongodb://localhost:27017/test', function(err, db) {
        assert.equal(null, err);
        insertDocument(db, function() {
            db.close();
        });
    });
    

    如果你需要一个ObjectId的纯JavaScript对象,你可以使用下面的库。

    https://www.npmjs.com/package/objectid-purejs

    【讨论】:

    • 对于 ObjectID,我找到了可以使用 Meteor.Collection.ObjectID 的信息。但不,我得到ReferenceError: BinData is not defined
    • 似乎不是正确的答案。得到错误.Binary is not a function`。
    猜你喜欢
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 2011-12-01
    • 2014-11-04
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多