Mongodb не может запросить вложенный документ по идентификатору (возвращает ноль)

1

Итак, у меня есть эта схема Мангуста:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var CommentSchema = new Schema({
  body: {type: String, required: true, max: 2000},
  created: { type: Date, default: Date.now },
  flags: {type: Number, default: 0},
  lastFlag: {type: Date, default: Date.now()},
  imageBanned: {type: Boolean, default: false},
  fileName: {type: String, default: ""}
}, {
  writeConcern: {
    w: 0,
    j: false,
    wtimeout: 200
  }  
});

var PostSchema = new Schema({
  body: {type: String, required: true, max: 2000},
  created: { type: Date, default: Date.now },
  flags: {type: Number, default: 0},
  lastFlag: {type: Date, default: Date.now()},
  fileName: {type: String, default: ""},
  imageBanned: {type: Boolean, default: false},
  board: {type: String, default: ""},
  comments: [{ type: Schema.Types.ObjectId, ref: 'Comment' }]
}, {
  writeConcern: {
    w: 0,
    j: false,
    wtimeout: 200
  }  
});


var Post =  mongoose.model('Post', PostSchema);
var Comment = mongoose.model('Comment', CommentSchema)

module.exports = {Post, Comment}

И я пытаюсь запросить комментарий внутри массива комментариев в посте.

Это конечная точка, которую я пытаюсь:

router.post('/flagComment', (req, res, next)=>{
  console.log('inside /flagComment')
  console.log('value of req.body: ', req.body)
  model.Post.findOne({"comments._id": req.body.id}).exec((err, doc)=>{
    if(err){
      console.log('there was an error: ', err)
    }
    console.log('the value of the found doc: ', doc)
    res.json({dummy: 'dummy'})
  })
})

Тем не менее, это дает следующий вывод терминала:

value of req.body:  { id: '5c9bd902bda8d371d5c808dc' }
the value of the found doc:  null

Это не правильно... Я проверил, что идентификатор верен - почему не найден комментарий?

РЕДАКТИРОВАТЬ:

Я попытался это решение (не могу найти документы, поиск по ObjectId с помощью Mongoose), установив objectID следующим образом:

var ObjectId = require('mongoose').Types.ObjectId; 

router.post('/flagComment', (req, res, next)=>{
  console.log('inside /flagComment')
  console.log('value of req.body: ', req.body)
  console.log('value of objid req id : ',  ObjectId(req.body.id))
  model.Post.find({"comments._id": ObjectId(req.body.id)}).exec((err, doc)=>{
    if(err){
      console.log('there was an error: ', err)
    }
    console.log('the value of the found doc: ', doc)
    res.json({dummy: 'dummy'})
  })
})

И я получаю следующий вывод терминала:

value of req.body:  { id: '5c9bd902bda8d371d5c808dc' }
value of objid req id :  5c9bd902bda8d371d5c808dc
the value of the found doc:  []

Таким образом, это еще не решение, хотя, похоже, оно лучше, чем у меня.

Теги:
database
mongoose

2 ответа

1

Вы не запрашиваете ObjectId, независимо от того, насколько вы о нем думаете. Вы запрашиваете ObjectId, закодированный как шестнадцатеричная строка, что не одно и то же. Правильно, и вы, вероятно, будете иметь гораздо больший успех.

Отредактировано для разработки из оболочки REPL Монго (JS):

> // Omitting the _id, or generating a new one, are equivalent during insert.
> db.foo.insert({_id: ObjectId()})
WriteResult({ "nInserted" : 1 })

> db.foo.find()  // As expected, we get back our _real_ ObjectId value.
{ "_id" : ObjectId("5c9cfab873724727778c0730") }

> // Can we "insert the record again" using a string version of the ID?
> db.foo.insert({_id: "5c9cfab873724727778c0730"})
WriteResult({ "nInserted" : 1 })  // Sure as heck can! No unique violation!

> db.foo.find()  // Because THESE ARE NOT THE SAME
{ "_id" : ObjectId("5c9cfab873724727778c0730") }
{ "_id" : "5c9cfab873724727778c0730" }

После нашего обсуждения в IRC, кажется, возникают трудности в понимании "поисковых терминов" в ответах, которые вам дают. Ищите здесь в StackOverflow (или Google, или DDG) "mongoose typecast ObjectId" (без кавычек или просто "mongoose ObjectId"…), и вы найдете много ответов, так как это является особенно распространенной проблемой для пользователей Mongoose.

  • 0
    Можете ли вы привести пример кода? Я не уверен, что понимаю.
  • 0
    @PeterWey, и я не мангуст, и я не JS. Ответ ясен: приведите значение к реальному ObjectId прежде чем пытаться выполнить запрос, используя это значение. Шестнадцатеричная строка! = Двоичное значение, такая же как строка в кодировке base64! = Исходное двоичное значение.
Показать ещё 2 комментария
0

Один раз попробуйте проверить с заполнением справочных данных, а затем запросить _id комментария.

* Получить идентификатор сообщения также из внешнего интерфейса в дополнение к идентификатору комментария, таким образом это будет легче.

Post.findOne({_id:'postId'})
.populate({
  path  : 'comment',
  match : { _id : 'commentId' }
})
.exec(...);
  • 0
    Спасибо ... я имею в виду, что это работает, но ... это немного похоже на бэкдор. Почему я не могу просто запросить комментарий по идентификатору напрямую? Я думаю, что для этого нужно A) obv. Передача другого идентификатора и Б) Я думаю, что поиск почты, когда мне не нужно, это другой запрос.
  • 0
    если вы проверяете базу данных, mongodb не сохраняет данные в поле комментариев, как будто вы ищете "comments._id", он сохраняет в формате что-то вроде {"$ ref": "comment", "$ id": ObjectId ( "commentid"), "$ db": "dbname"}
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню