Не могу сравнить даты моментов в MongoDb - PullRequest
0 голосов
/ 02 января 2019

Итак, моя цель - получить сообщения с комментариями, которые размещены сегодня в Mongoose.

Сначала я создаю объект текущей даты в формате UTC с:

const todayForEvent = moment().startOf('day')
  .utc().toDate();

это приводит к 2019-01-02T06:00:00.000Z

тогда я хочу создать поиск в БД с помощью mongoose, чтобы получить сообщения, в которых был размещен комментарий сегодня

const posts = await Post.find({
        // From this user...
        $and: [
          // Find normal posts that has comments (recent interactions)
          { _posted_by: userId },
          { comments: { $exists: true, $ne: [] } },
          { 'comments.created_date': { $gte: todayForEvent } }
    ]

})

В-третьих, у меня есть комментарии к документам мангуста, у которых есть свойство create_date

const CommentSchema = new Schema({

  created_date: {
    type: Date,
    default: moment().utc().toDate()
  }

});

const Comment = mongoose.model('Comment', CommentSchema);

module.exports = Comment;

Это результат документа после размещения комментария

enter image description here

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

РЕДАКТИРОВАТЬ: добавлена ​​схема публикации по запросу

const mongoose = require('mongoose');

const { Schema } = mongoose;

const PostSchema = new Schema({
  content: {
    type: String,
    trim: true
  },
  _content_mentions: [{
    type: Schema.Types.ObjectId,
    ref: 'User'
  }],
  type: {
    type: String,
    required: true,
    enum: ['normal', 'event', 'task']
  },
  _liked_by: [{
    type: Schema.Types.ObjectId,
    ref: 'User'
  }],
  comments_count: {
    type: Number,
    default: 0
  },
  comments: [{
    type: Schema.Types.ObjectId,
    ref: 'Comment'
  }],
  _group: {
    type: Schema.Types.ObjectId,
    ref: 'Group',
    required: true
  },
  _posted_by: {
    type: Schema.Types.ObjectId,
    ref: 'User',
    required: true
  },
  task: {
    due_to: {
      type: String,
      default: null
    },
    _assigned_to: {
      type: Schema.Types.ObjectId,
      ref: 'User'
    },
    status: {
      type: String,
      enum: ['to do', 'in progress', 'done']
    }
  },
  event: {
    due_to: {
      type: Date,
      default: null
    },
    _assigned_to: [{
      type: Schema.Types.ObjectId,
      ref: 'User'
    }]
  },
  created_date: {
    type: Date,
    default: Date.now
  },
  files: [{
    orignal_name: {
      type: String,
      default: null
    },
    modified_name: {
      type: String,
      default: null
    }
  }]
});

const Post = mongoose.model('Post', PostSchema);

module.exports = Post;

РЕДАКТИРОВАТЬ 2: образец почтового документа

{ _id: 5c2d14c30176ac30204809a8,
    task: { due_to: null },
    event: { due_to: null, _assigned_to: [] },
    _content_mentions: [],
    _liked_by: [],
    comments_count: 1,
    comments: [ 5c2d14dc0176ac30204809ab ],
    content: '<p>poging 5 duust</p>',
    type: 'normal',
    _posted_by:
     { _id: 5c292e0e63deb43d9434f664,
       profile_pic: 'default_user.png',
       first_name: 'Jaspet',
       last_name: 'Houthoofd' },
    _group: 5c292db763deb43d9434f660,
    created_date: 2019-01-02T19:45:07.710Z,
    files: [],
    __v: 0,
    liked_by: [] }

** РЕДАКТИРОВАТЬ 3: образец комментария **

{ _content_mentions: [],
  created_date: 2019-01-02T21:10:04.456Z,
  _id: 5c2d28c251f2bd332cdeaf0a,
  content: '<p>hehe</p>',
  _commented_by: 5c292db763deb43d9434f65f,
  _post: 5c2d1dd254ca0429b470f000,
  __v: 0 }

1 Ответ

0 голосов
/ 03 января 2019

Итак, проблема в том, что у вас есть две коллекции, posts и comments. На основе вашей схемы Posts массив comments содержит только идентификаторы, которые ссылаются на документы, хранящиеся во второй коллекции. Вот почему вы можете проверить, существует ли этот массив и не является ли он пустым, но вы не можете напрямую ссылаться на эти элементы.

Чтобы исправить это, вы можете использовать $ lookup , чтобы получить эти документы из comments в posts, а затем вы можете применить свое условие даты внутри $ match , попробуйте:

let posts = await Post.aggregate([
    { $match: { comments: { $exists: true, $ne: [] }, _postedBy: userId } },
    { $lookup: { from: "comments", localField: "comments", foreignField: "_id", as: "comments" } },
    { $match: { 'comments.created_date': { $gte: todayForEvent } } }
])
...