Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “mongodb聚合”$_id";返回id作为字符串而不是对象_Javascript_Mongodb_Aggregate - Fatal编程技术网

Javascript “mongodb聚合”$_id";返回id作为字符串而不是对象

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: [

mongodb聚合“$\u id”返回id作为字符串而不是objectID。 当我将文档的“$\u id”发送给函数时,聚合无法比较objectID和string。下面的查询(返回空):

这就是我的一些职能:

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")}}
                ]);