#node.js #mongodb #objectid
Вопрос:
Ниже приведен мой код для создания отзыва и добавления его в мой массив отзывов о коллекциях ресторанов, я также показываю этот отзыв после добавления его в коллекцию.
const res = require('./restaurants'); async create (restaurantId, title, reviewer, rating, dateOfReview, review) { // check(restaurantId, title, reviewer, rating, dateOfReview, review) restaurantId = ObjectId(restaurantId) const restaurantsCollection = await restaurants(); let newReview = { _id: ObjectId(), title : title, reviewer : reviewer, rating : rating, dateOfReview : dateOfReview, review : review }; await restaurantsCollection.updateOne({ _id : restaurantId},{ $push: {reviews: newReview} }) const r = await restaurantsCollection.findOne({ _id: restaurantId }); let len = r.reviews.length r.overallRating = rating let avg = r.overallRating/len /* await restaurantsCollection.updateOne( { "r.overallRating": r.overallRating }, { $set: { "r.$.overallRating" : avg } } ) */ var query = { _id : restaurantId }; var data = { $set : {overallRating : avg} } ; await restaurantsCollection.updateOne( query,data ); restaurantId = restaurantId.toString().replace(/ObjectId("(.*)")/, "$1"); return res.get(restaurantId) },
restaurant.js:
async get(id) { if (!id) throw 'You must provide an id to search for'; checkString(id); var checkForHexRegExp = new RegExp("^[0-9a-fA-F]{24}$"); if(checkForHexRegExp.test(id)===false) throw 'Not a valid objectid'; id = ObjectId(id); const restaurantsCollection = await restaurants(); const res= await restaurantsCollection.findOne({ _id: id }); if (res === null) throw 'No restaurant with that id'; res._id = res._id.toString().replace(/ObjectId("(.*)")/, "$1"); return res; },
Результат, который я получаю, таков:
{ _id: '6174cf81053daf4b9937ef80', name: 'Saffron Lounge', location: 'SoHo, New York', phoneNumber: '123-456-1234', website: 'http://www.thesaffronlounge.com', priceRange: '$
Как я могу изменить поле _id, чтобы в нем не было нового объекта и просто отображалась строка, я пытался добавить JSON.stringify() в возвращаемый результат, но он не возвращает его как объект, также я пытался использовать:
toString().replace(/ObjectId("(.*)")/, "$1");
Но это не работает для обзоров, так как я создаю новый объект() в функции создания, и я не знаю, где это правильно добавить, есть ли более простой способ отображения:
_id: "6174cfb953edbe9dc5054f9a"
Ответ №1:
Вам просто нужно запросить функцию ObjectId у вашего mongo.
ObjectId = require('mongodb').ObjectID;
Тогда вы можете использовать его вот так:
ObjectId("34234234234234234234")
Комментарии:
1. Где я могу это отобразить, так как отзывы не являются коллекцией, и я возвращаю данные из коллекции ресторанов
2. Я тоже попробовал это, не получилось: ожидание restaurantsCollection.updateOne({ _id : ObjectId(restaurantId). toString()},{ $push: {отзывы: newReview} })
Ответ №2:
Добавление приведенного ниже кода сработало для меня:
for(i=0;ilt;a.reviews.length;i ){ a.reviews[i]._id = a.reviews[i]._id.toString().replace(/ObjectId("(.*)")/, "$1"); }
, cuisines: [ 'Italian' ], overallRating: 0.13518518518518519, serviceOptions: { dineIn: false, takeOut: false, delivery: true }, reviews: [ { _id: new ObjectId("6174cfb953edbe9dc5054f9a"), title: 'bo', reviewer: 'dd', rating: 2, dateOfReview: '15/1/2002', review: ' ruh' }, Как я могу изменить поле _id, чтобы в нем не было нового объекта и просто отображалась строка, я пытался добавить JSON.stringify() в возвращаемый результат, но он не возвращает его как объект, также я пытался использовать:
Но это не работает для обзоров, так как я создаю новый объект() в функции создания, и я не знаю, где это правильно добавить, есть ли более простой способ отображения:
Ответ №1:
Вам просто нужно запросить функцию ObjectId у вашего mongo.
Тогда вы можете использовать его вот так:
Комментарии:
1. Где я могу это отобразить, так как отзывы не являются коллекцией, и я возвращаю данные из коллекции ресторанов
2. Я тоже попробовал это, не получилось: ожидание restaurantsCollection.updateOne({ _id : ObjectId(restaurantId). toString()},{ $push: {отзывы: newReview} })
Ответ №2:
Добавление приведенного ниже кода сработало для меня: