我正在尝试从MongoDB中检索文档。该文件包含字段" ownerId"包含二进制UUID。如果我启动命令,则使用Mongo控制台
db.dataset.find({ownerId: BinData(3,"ZQ6EAOKbQdSnFkRmVUUAAA==")}).pretty()
它返回:
{
"_id" : BinData(3,"VQ6EAOKbQdSnFkRmVUUAAA=="),
"name" : "Twitter",
"objectType" : "Tweet",
"ownerId" : BinData(3,"ZQ6EAOKbQdSnFkRmVUUAAA==")
}
当我尝试从我的node.js程序中检索文档时,它会失败并且不会返回任何文档。
我的节目是:
var mongo = require('mongoskin');
var db = mongo.db("mongodb://192.168.1.100:27017/test", {native_parser:true});
function HexToBase64(g) {
...
}
var uuidstr = "650e8400e29b41d4a716446655450000";
console.info(uuidstr);
base64str = HexToBase64(uuidstr);
console.info(base64str);
db.collection('dataset').find( { ownerId:new mongo.Binary(base64str, 4) } ).toArray(function (err, items) {
if(err) {
var msg = "Error getting 'dataset' objects from database.";
console.info(msg + " " + err);
return;
}
console.info("OK");
console.info(items);
});
输出结果为:
650e8400e29b41d4a716446655450000
ZQ6EAOKbQdSnFkRmVUUAAA==
OK
[]
我做错了什么?
答案 0 :(得分:0)
首先,由于您要通过OwnerId查询集合,我建议在那里创建索引。你可以很容易地用mongoskin实现这个目标:
// Create and index by ownerId
db.collection('dataset').ensureIndex([['ownerId', 1]], true, function(err, res) {
if (err) throw err;
});
完成上述操作后,您现在可以执行以下操作:
db.collection('dataset').findOne({ ownerId: 'some-uuid' }, callback);
此外,如果它是您之后的ObjectId类型,我建议您使用提供的帮助程序(请参阅this other question)来实现:
var ownerId = mongoskin.ObjectID(uuidstr);
否则,我采用不同的方法perhaps using node-uuid
:
var uuid = require('node-uuid');
var ownerId = uuid.v4();
db.collection('dataset').findOne({ ownerId: ownerId }, callback);
希望这有帮助,