1

我正在尝试从 MongoDB 检索文档。该文档具有包含二进制 UUID 的字段“ownerId”。如果我启动命令,则使用 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
[]

我究竟做错了什么?

4

1 回答 1

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

否则,我会采用不同的方法,也许使用node-uuid

var uuid = require('node-uuid');
var ownerId = uuid.v4();
db.collection('dataset').findOne({ ownerId: ownerId }, callback);

希望这可以帮助,

于 2014-08-05T15:37:14.720 回答