如何将带有objectId的二进制数据添加到mongoDB?
How to add binary data with objectId to mongoDB?
我需要将一个文档插入一个集合,它有一个 ObjectId
和一个 BinData
值。所以我不知道怎么插入。
使用此代码我得到错误 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
这是将数据插入集合的 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 对象,您可以使用以下库。
今天也偶然发现了这个。
正如提到的另一个答案,您可以使用 MongoDB 驱动程序提供的 ObjectID
和 Binary
。我遇到的问题是二进制数据不是我在插入后所期望的,这是由于 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()
}
}
我需要将一个文档插入一个集合,它有一个 ObjectId
和一个 BinData
值。所以我不知道怎么插入。
使用此代码我得到错误 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
这是将数据插入集合的 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 对象,您可以使用以下库。
今天也偶然发现了这个。
正如提到的另一个答案,您可以使用 MongoDB 驱动程序提供的 ObjectID
和 Binary
。我遇到的问题是二进制数据不是我在插入后所期望的,这是由于 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()
}
}