Глубокий запрос и обновление вложенного документа mongoose/mongodb

Схема

var chapterSchema = new Schema({_id: Number, completed: Boolean}) 
var bookSchema = new Schema({  date: { type: Date, default: Date.now }, author: String,  chapter: chapterSchema })
var personSchema = new Schema({ _id: Number, name: String, books: [bookSchema] })

Образец объекта (объект-человек)

{
  _id: 1,
  name: Bond,
  books: [{
    date: ISODate("2017-10-24T19:01:18.362Z”),
    author: Martin,
    chapter: {}
  }]
}

Поддокумент (объект главы)

var chapter = new chapterSchema({_id: 1, completed: true})

Требование

Я хотел бы добавить объект главы в образец объекта (person.books)

Ожидается

{
  _id: 1,
  name: Bond,
  books: [{
    date: ISODate("2017-10-24T19:01:18.362Z”),
    author: Martin,
    chapter: {
      _id: 1,
      completed: true
    }
  }]

Пробовал

let todayStart = new Date()
todayStart.setHours(0,0,0,0)

Patient.findOneAndUpdate({'_id': 1, ‘books.date': { $not: { $gt: todayStart } } }, {$set: {‘books.$.chapter’: chapter}}, {new: true, upsert: true}, (err, consultation) => {
  if (err) {
    console.error(‘[UPDATE] Failed to add chapter')
  } else {
    console.log(‘[UPDATE] chapter is added)
  }
})

У меня ошибка "Не удалось добавить главу"

Итак, я попытался найти один, чтобы получить любое из полей в поддокументе книги.

Patient.findOne({'_id': 1, ‘books.date': { $gt: todayStart } }, {“books.$.author”: 1}, (err, data) => {
  if (err) console.log('[find] data not found')
  console.log('[FIND]' + JSON.stringify(data)
})

Это дало мне следующий результат,

{_id: 1, books: [{ date: ISODate("2017-10-24T19:01:18.362Z”), author: Martin, chapter: {} }]}

Но я ожидал здесь только автора.

В конце концов, я хотел бы знать, как вставить объект в поддокумент в Mongodb/Mongoose.

P.S: новую дату() я получил от express.js, но здесь это не имеет значения.


person Prakash Ramasamy    schedule 24.10.2017    source источник


Ответы (1)


Это может помочь вам:

db.yourDb.update(
    {
        "_id": 1,
        "books": {
            "$elemMatch": {
                "date": {
                    "$lte": ISODate("2017-10-24T20:01:18.362+0000")
                }
            }
        }
    },
    {
        "$set": {
            "books.$.chapter": { "_id": 1, "completed": true }
        }
    }
)

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

person cbartosiak    schedule 24.10.2017