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

使用Objd的MunGDB聚合查找

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

    在MongoDB中,我正在努力寻找一个基本的查找。在尝试了多种组合之后,我不知道出了什么问题。我知道有很多问题需要解决,但是在尝试了所有的答案之后,一切都不起作用。

    这是我的 用户 收集

    enter image description here

    这是我的 项目 收集

    enter image description here

    每个项目都有一个所有者,该所有者映射到用户集合中的用户ID。 对于我的查询,我正尝试使用相应的用户获取项目。这是问题所在

       db.items.aggregate([
        {
            "$lookup" : {
              localField : "owner",
              from : "users",
              foreignField : "_id",
              as : "users"
            }
        }
    ])
    

    它返回这个-

    enter image description here

    我尝试过不同的变化-比如

    db.items.aggregate([
        {
            "$lookup" : {
              localField : "owner.str",
              from : "users",
              foreignField : "_id.str",
              as : "users"
            }
        }
    ])
    

    这会导致用户数组的填充不正确(所有用户!)是的。

    enter image description here

    我做错什么了?

    编辑

    这是 项目 收集

    {
      "_id": {
        "$oid": "5b268395c176db1548bd92c2"
      },
      "title": "Item #1",
      "description": "Item 1 Description",
      "categories": [
        {
          "$ref": "categories",
          "$id": {
            "$oid": "5b268248c176db1548bd92af"
          }
        }
      ],
      "status": "borrowed",
      "image": "http://cdn.site.com/testimage.png",
      "borrower": "5b2684a0c176db1548bd92d5",
      "owner": {
        "$ref": "users",
        "$id": {
          "$oid": "5aecc8012d3d947ba130800d"
        }
      }
    }
    
    {
      "_id": {
        "$oid": "5b2c2c4d3c70af2da07d1266"
      },
      "title": "Item 2",
      "description": "Item 2 Description",
      "categories": [
        {
          "$ref": "categories",
          "$id": {
            "$oid": "5b268248c176db1548bd92af"
          }
        }
      ],
      "status": "Available",
      "image": "http://cdn.site.com/testimage1.png",
      "borrower": null,
      "owner": {
        "$ref": "users",
        "$id": {
          "$oid": "5b2684a0c176db1548bd92d5"
        }
      }
    }
    

    这是 用户 收藏:

    {
      "_id": {
        "$oid": "5aecc8012d3d947ba130800d"
      },
      "email": "n.y@gmail.com",
      "registeredOn": "20/10/2018 12:12:29 AM",
      "avatarURL": "http://gravtar.com/12334",
      "friends": []
    }
    
    {
      "_id": {
        "$oid": "5b2684a0c176db1548bd92d5"
      },
      "email": "j.v@gmail.com",
      "registeredOn": "20/10/2018 12:12:29 AM",
      "avatarURL": "http://gravtar.com/12334",
      "friends": [],
      "wishlist": [
        {
          "$ref": "items",
          "$id": {
            "$oid": "5b2831543c70af2da07d11da"
          }
        }
      ]
    }
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   Alex Blex    7 年前

    这个 localField foreignField 应该是相同的数据类型。你的是 DBRef ObjectId 分别是。

        2
  •  0
  •   vizsatiz    7 年前

    如果要填充 items 与相应的用户记录,我认为您可以使用 populate 猫鼬的选择 find 美国石油学会

    示例代码:

    this.read = function(query, populate, onSuccess, onFailure, forcePull, sortQuery, ttl, limitValue, selectQuery) {
            var scope = this;
            logger.info(this.TAG, "Read operation execution started on ORM Object: "
                        + modelName + " with query: " + JSON.stringify(query));
            if (query) {
    
                var queryObject = this._model.find(query);
                if (populate) {
                  queryObject = queryObject.populate(populate);
                }
                if (selectQuery) {
                  queryObject = queryObject.select(selectQuery);
                }
                if (sortQuery) {
                  queryObject = queryObject.sort(sortQuery);
                }
                if (limitValue) {
                  queryObject = queryObject.limit(limitValue);
                }
                queryObject.exec(function(error, records) {
                    if (error) {
                        logger.error(scope.TAG, "Error while ORM read: " + JSON.stringify(error));
                        onFailure(error);
                        return;
                    }
                    logger.info(scope.TAG, "Record read successfully: " + JSON.stringify(records));
                    onSuccess(records);
                });
              }
         }
    

    可以将populate作为字符串数组传递,如 ['owner'] 对你来说