代码之家  ›  专栏  ›  技术社区  ›  sayres

MongoDB查询中forEach函数中未定义的值

  •  0
  • sayres  · 技术社区  · 7 年前

    这是我的文件:

    {
    "CreationDateTime" : ISODate("2017-09-26T06:39:29.105Z"),
    "DeviceId" : "89984320001499681816",
    "UserId" : UUID("bca0db12-2246-49a5-8703-b03fee45e50f"),
    "FirstName" : " ",
    "LastName" : "",
    }
    

    我的一些文件,” “和” “已填写。但所有文件均已填写 设备ID

    我编写了这个查询,我想把一个对象传递给一个名为Filled的方法。

    db.location.aggregate([
     {$match : {
         FirstName : 
             {$nin : [" "]}
                }
      },
     {$group: {_id : "$DeviceId" }
     },{
     $project: {
         "DeviceId" : 1
     }}
     ]).forEach(
      function(obj)
        {
          print(
          "Orginal Coll \nDeviceId: " + obj.DeviceId
          +" \nFirstName: "   + obj.FirstName
          +" \nLastName: "    + obj.LastName)
          //compareCollection(obj);
    
    });
    

    但最后我得到了这个:

    Orginal Coll 
    DeviceId: undefined 
    FirstName: undefined 
    LastName: undefined
    

    问题是什么?

    1 回复  |  直到 7 年前
        1
  •  1
  •   glytching    7 年前

    我发现这个命令有几个问题:

    db.location.aggregate([
     {$match : { FirstName: { $nin : [" "] } } },
     {$group: {_id : "$DeviceId" } },
     {$project: { "DeviceId" : 1 } }
    ])
    
    1. 这个 $match "FirstName" : " " 因此,该文件将与 $in 但不是通过 $nin
    2. $匹配 阶段更改为 $英寸 _id 属性,因此它返回以下中间文档:

      {
          "_id" : "89984320001499681816"
      }
      
    3. $project 阶段尝试项目 "DeviceId" 只有 _id DeviceId 来自该文档的属性。

    4. 当聚合管道到达 forEach

    要进一步了解聚合管道内发生的情况,可以运行以下查询:

    db.location.aggregate([
     {$match : { FirstName: { $in : [" "] } } },
     {$project: { "DeviceId" : 1, FirstName: 1, LastName: 1 } }
    ]).forEach(
      function(obj) {
          print(obj);
      }
    );
    

    此命令。。。

    db.location.aggregate([
     {$match : { FirstName: { $in : [" "] } } }
    ])
    

    ... 返回:

    {
        "_id" : ObjectId("59d13b64c26584cd8b7a15c8"),
        "CreationDateTime" : ISODate("2017-09-26T06:39:29.105Z"),
        "DeviceId" : "89984320001499681816",
        "UserId" : UUID("bca0db12-2246-49a5-8703-b03fee45e50f"),
        "FirstName" : " ",
        "LastName" : ""
    }
    

    db.location.aggregate([
     {$match : { FirstName: { $in : [" "] } } },
     {$group: {_id : "$DeviceId" } }
    ])
    

    ... 返回:

    {
    }
    

    此命令。。。

    db.location.aggregate([
     {$match : { FirstName: { $in : [" "] } } },
     {$group: {_id : "$DeviceId" } },
     {$project: { "DeviceId" : 1 } }
    ])
    

    {
    “_id”:“899843200014996816

    这应该清楚地表明,一旦您添加了 $group forEach公司