поиск агрегации mongodb с использованием ObjectId - PullRequest
0 голосов
/ 25 июня 2018

Я борюсь с тем, что кажется базовым поиском в 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

Что я делаю не так?

EDIT

вот предметов коллекция

{
  "_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 ]

0 голосов
/ 25 июня 2018

localField и foreignField должны быть одного типа данных.Вы DBRef и ObjectId соответственно.

0 голосов
/ 25 июня 2018

Если вы хотите заполнить запись items соответствующим пользователем, я думаю, вы можете использовать опцию populate в mongoose find API

Пример кода:

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

Вы можете передать заполнить как массив строк, таких как ['owner'] в вашем случае

...