Javascript “mongodb聚合”$_id";返回id作为字符串而不是对象
mongodb聚合“$\u id”返回id作为字符串而不是objectID。 当我将文档的“$\u id”发送给函数时,聚合无法比较objectID和string。下面的查询(返回空): 这就是我的一些职能:Javascript “mongodb聚合”$_id";返回id作为字符串而不是对象,javascript,mongodb,aggregate,Javascript,Mongodb,Aggregate,mongodb聚合“$\u id”返回id作为字符串而不是objectID。 当我将文档的“$\u id”发送给函数时,聚合无法比较objectID和string。下面的查询(返回空): 这就是我的一些职能: const succPays = db.financial.successpayrequests.aggregate([ { $match: { $and: [
const succPays = db.financial.successpayrequests.aggregate([
{
$match:
{
$and:
[
{
userID: uid
}
]
}
},
{
$group:
{
_id: null,
amountSum: { $sum: '$amount' }
}
}
]).toArray();
return succPays;
当我在硬代码中发送param时,一切都正常,因为param作为对象发送(返回非空数组)
问题是封闭函数的执行顺序。Javascript在组装
$addFields
表达式并将完全烘焙的管道传递到db.foo.aggregate()
之前,正在调用fetchUserCreadit
。Javascript看到$\u id
并将其作为字符串发送;它不知道MongoDB,事实上,在它被称为MongoDB的时候,甚至没有一条管道在运行。这里是一个紧凑但类似的问题演示
function myFunc(id) {
print("myFunc: got " + id);
return db.foo.findOne({_id: id});
}
db.foo.aggregate([
{$match: { _id: ObjectId(s_oid1) }}
,{$addFields: {qq: myFunc("$_id")}}
]);
聚合管道是否将
\u id
返回为字符串
,或者是否要将字符串id与聚合管道中的对象id进行比较?我要将字符串id与聚合管道中的对象id进行比较,或者将字符串强制转换为对象id。使用聚合管道无法执行此操作,使用map reduce,您可以调用用户定义的函数我可以聚合调用自定义函数,但我的问题是_id参数以字符串而不是对象的形式发送到函数($_id)),但当我使用硬代码发送它时(ObjectId(ac54adv5dv21adv5avd126)),似乎没问题!
db.getCollection('general.users').aggregate([
{
$match: { _id: ObjectId("5a48894e4639fa6d7703c4f4") }
},
{
$addFields: { creadit: fetchUserCreadit(ObjectId("5a48894e4639fa6d7703c4f4")) }
},
function myFunc(id) {
print("myFunc: got " + id);
return db.foo.findOne({_id: id});
}
db.foo.aggregate([
{$match: { _id: ObjectId(s_oid1) }}
,{$addFields: {qq: myFunc("$_id")}}
]);