Прежде всего, извините за мой плохой английский, но я постараюсь изо всех сил объясниться. Я студент, который пытается разработать проект nodejs с помощью express, до сих пор я использовал как db в одном файле json и работал через него. Но теперь я хочу перейти на Mongodb. Я уже импортировал свою базу данных с помощью "mongoimport --db RestauranteSin" --collection "Restaurante" --file 'filename' ", поэтому он импортировал его нормально.
Следующее, что я делаю, - это создание новой конечной точки.
app.get('/mongoAllRestaurants', (req, res) => {
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect("mongodb://localhost:27017/", { useNewUrlParser: true },(err, db) => {
if (err) throw err;
var dbo = db.db("RestauranteSin");
var ObjectId = require('mongodb').ObjectID;
dbo.collection("Restaurante").find({_id:ObjectId("5bd218627c5b747cdb14c51e"), restaurantes: {$elemMatch : {titulo_restaurante: "BarJanny"}}}).toArray((err, result) => {
if (err) throw err;
console.info(result[0]);
res.send(result);
db.close();
});
});
});
И мой db выглядит примерно так:
[
"_id" : "345678987654",
"restaurantes": [
{
"titulo_restaurante": "example1",
...
...
...
},
{
"titulo_restaurante": "example2",
...
...
...
},
...
...
...
]
]
И вот в чем вопрос. ¿Почему, если я выполняю запрос, он возвращает все мои БД без фильтра? У меня много комбинаций запросов, и они всегда возвращают мне все db или пустой массив? Мне нужно в результате что-то вроде этого:
{
"titulo_restaurante": "example1",
...
...
...
}
В коде запроса есть две ошибки:
Вам не хватает команды new
. Когда вы найдете для документа
_id, вы ищете объект ObjectID с определенной инициализацией (которая является строкой идентификатора), поэтому вы должны создать объект
вы ищете: new ObjectId ('idString'), результат будет
ObjectID, который можно сравнить с документами _id для поиска
правый документ (обратите внимание, что с var ObjectId = require('mongodb').ObjectID;
вам требуется класс ObjectID пакета mongodb и назначьте его var ObjectId).
Проекция внутри find устарела. Вы можете использовать projection (), например: db.collection('collectionName').find({ field: value }).project({ field: value })
В случае вашего запроса: dbo.collection("Resturante").find({ _id: new ObjectId('5bd218627c5b747cdb14c51e') }).project({ restaurantes: { . $elemMatch: { titulo_restaurante: "BarJanny" } } })
Итак, ваш запрос без ошибок:
dbo.collection("Resturante")
.find({ _id: new ObjectId('5bd218627c5b747cdb14c51e') })
.project({ restaurantes: { $elemMatch: { titulo_restaurante: "BarJanny" } } })
.toArray((err, result) => {
if (err) throw err;
console.info(result[0].restaurantes[0]); // { titulo_restaurante: 'BarJanny' }
db.close();
});
Добавьте res.send(result)
перед db.close()
для ответа GET.
Привет, приятно. Я изменил ответ и лично попробовал код. Теперь это работает. Первая проблема, о которой я упомянул, была правильной, но вторая проблема заключается в том, что проекция внутри .find () устарела (см. Новое решение).
Привет, сначала спасибо за ответ на мой вопрос, и я уже пробую это, но я понятия не имею, почему он продолжает возвращать мне всю базу данных, не могу понять, что не так .... это не запрос.