使用 Java LUUID(旧版表示)存储 MongoDB id,当运行脚本来检索这些 id 时,输出会以二进制格式显示它们:
var myStringArray = ["string1",
"string2"];
for (var i = 0; i < myStringArray.length; i++) {
let outputs = db.getCollection("MyCollection").aggregate(
{
'$match': {
"field1": myStringArray[i]
}
}
, { $project: { _id: 1, "field1": 1 } }
).map(function (el) { return EJSON.stringify(el) });
console.log(outputs);
}
输出:
[
'{"_id":{"$binary":{"base64":"Z0raDiKJKdjkWnqi5TvWjQ==","subType":"03"}},"field1":"string1"}'
]
[
'{"_id":{"$binary":{"base64":"a0xH8uquuKwwbsRc4LggvA==","subType":"03"}},"field1":"string2"}'
]
更喜欢看到类似于
"_id"
的 "_id": JUUID("ACB8AEEA-D247-4C6B-BC20-B8E05C146F30")
。
注意:我不是问如何以子类型 4(标准)UUID 格式存储。 MongoDB 驱动程序设置为 UuidRepresentation.JAVA_LEGACY 并且不会更改。
最接近获得十六进制表示形式的是使用
.toString('hex', 3)
。
db.collection.insertOne({_id: BinData(3, "Z0raDiKJKdjkWnqi5TvWjQ==") ,"field1":"string1"})
var doc = db.collection.findOne({})
doc._id.toString('hex') // 674ada0e228929d8e45a7aa2e53bd68d
// to verify that
Binary.createFromHexString(doc._id.toString('hex', 3), 3)
// returns Binary.createFromBase64('Z0raDiKJKdjkWnqi5TvWjQ==', 3)
Binary.createFromHexString("674ada0e228929d8e45a7aa2e53bd68d", 3)
// returns Binary.createFromBase64('Z0raDiKJKdjkWnqi5TvWjQ==', 3)
对于您的数据和代码,请使用:
db.collection.insertMany([
{ "_id": BinData(3, "Z0raDiKJKdjkWnqi5TvWjQ=="), "field1": "string1" },
{ "_id": BinData(3, "a0xH8uquuKwwbsRc4LggvA=="), "field1": "string2" },
]);
var myStringArray = ["string1", "string2"];
for (var i = 0; i < myStringArray.length; i++) {
let output = db.getCollection("collection").aggregate(
{ $match: { "field1": myStringArray[i] } },
{ $project: { _id: 1, "field1": 1 }
}).map(function (el) {
el._id = el._id.toString('hex', 3) // NOTE this line
return el
});
console.log(output);
}
输出是:
{
_id: '674ada0e228929d8e45a7aa2e53bd68d',
field1: 'string1'
}
{
_id: '6b4c47f2eaaeb8ac306ec45ce0b820bc',
field1: 'string2'
}