Задать вопрос
HorrorInferno
@HorrorInferno
веб-разработчик, бэкэндер

Как правильно использовать функции в MongoDB для sql joins-подобного запроса?

Есть две коллекции.
inventory:
> db.inventory.find().pretty()
{
        "_id" : 1,
        "sku" : "almonds",
        "description" : "product 1",
        "instock" : 120
}
{ "_id" : 2, "sku" : "bread", "description" : "product 2", "instock" : 80 }
{
        "_id" : 3,
        "sku" : "cashews",
        "description" : "product 3",
        "instock" : 60
}
{
        "_id" : 4,
        "sku" : "pecans",
        "description" : "product 4",
        "instock" : 70
}
{ "_id" : 5, "sku" : null, "description" : "Incomplete" }
{ "_id" : 6 }


И orders:
> db.orders.find().pretty()
{ "_id" : 1, "item" : "almonds", "price" : 12, "quantity" : 2 }
{ "_id" : 2, "item" : "pecans", "price" : 20, "quantity" : 1 }
{ "_id" : 3 }


Я выполняю следующий запрос:
db.orders.find().forEach(
	function (newOrders) {
		newOrders.item = db.inventory.findOne({"sku": newOrders.item});
		db.ordersRealoded.insert(newOrders);
	}
)


Но после него выкидывается ошибка:
2018-08-07T14:18:10.868+0300 E QUERY    [js] Error: error: {
        "ok" : 0,
        "errmsg" : "cannot compare to undefined",
        "code" : 2,
        "codeName" : "BadValue"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DBCommandCursor@src/mongo/shell/query.js:707:1
DBQuery.prototype._exec@src/mongo/shell/query.js:113:28
DBQuery.prototype.hasNext@src/mongo/shell/query.js:287:5
DBCollection.prototype.findOne@src/mongo/shell/collection.js:254:10
@(shell):3:18
DBQuery.prototype.forEach@src/mongo/shell/query.js:500:1
@(shell):1:1


В чём может быть трабл? Нужно, чтобы в новой коллекции было поле item со всеми значениями из inventory.sku.

Сейчас пытаюсь это сделать на простом примере, дабы разобраться со вложенными запросами. Буду рад, если покидаете ссылочек на какую-нибудь русскоязычную доку или тутор по этой теме.
Спасибо.
  • Вопрос задан
  • 257 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы