没有结果在MongoDB中通过UUID检索文档

时间:2014-07-10 11:56:35

标签: javascript node.js mongodb mongoskin

我正在尝试从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
[]

我做错了什么?

1 个答案:

答案 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);

希望这有帮助,