Is it possible to query subdocuments directly using mongoose?

风格不统一 提交于 2019-12-12 23:00:41

问题


let's say there was a User model and a Post model. In this situation User's would have many posts; User would be the parent and Post would be the child. Is it possible to query for posts directly?

For instance if I wanted to do something like

app.get('/post/search/:query', (req,res) => {
       Posts.find({title: req.params.query }, (err,post) => {
            res.send(JSON.stringify(post))
       })
})

or would one have to do:

app.get('/post/search/:query',(req,res) => {

  let resultsFromQuery = [];
  User.find({'post.title':req.params.query'}, (err,user) => {
       user.posts.forEach((post) => {
           if(post.title === req.params.query){
               resultsFromQuery.push(post); 
           }
       })
  })
res.send(JSON.stringify(resultsFromQuery))

})

EDIT: Here is my schema's.

User Schema (Parent)

const mongoose = require('mongoose'),
    Schema = mongoose.Schema,
    PostSchema = require('./post.js');

let UserSchema = new Schema({
    username: {
        type: String,
        required: true,
        unique: true
    },
    password: {
        type: String,
        required: true
    },
    posts: [PostSchema]
})

module.exports = mongoose.model('User',UserSchema);

Post Schema (Child)

const mongoose = require('mongoose'),
    Schema = mongoose.Schema;

let PostSchema = new Schema({
    title: {
        type: String
    },
    description: {
        type: String
    },
    image: {
        type: String
    },
    original_poster: {
        id: {
            type: String,
            required: true
        },
        username: {
            type: String,
            required: true
        }
    },
    tags: {
        type: [String],
        required: true
    }
})

module.exports = PostSchema;

EDIT:

Here is a sample document

the result of db.users.find({username: 'john'})

{
    "_id" : ObjectId("5a163317bf92864245250cf4"),
    "username" : "john",
    "password" : "$2a$10$mvE.UNgvBZgOURAv28xyA.UdlJi4Zj9IX.OIiOCdp/HC.Cpkuq.ru",
    "posts" : [
        {
          "_id" : ObjectId("5a17c32d54d6ef4987ea275b"),
            "title" : "Dogs are cool",
            "description" : "I like huskies",
            "image" : "https://media1.giphy.com/media/EvRj5lfd8ctUY/giphy.gif",
            "original_poster" : {
                "id" : "5a163317bf92864245250cf4",
                "username" : "john"
            },
            "tags" : [
                "puppies",
                "dogs"
            ]
        }
    ],
    "__v" : 1
}

回答1:


Yes you can find directly the post title from the user model. like bellow

User.find({"posts.title": "Cats are cool"}, (err, users) => {
  if(err) {
    // return error
  }
  return res.send(users)
})

That will return user with all post not only the matching post title. So to return only matching post title can use $ positional operator. like this query

User.find({"posts.title": "Cats are cool"},
  {username: 1, "posts.$": 1}, // add that you need to project
  (err, users) => {
    if(err) {
      // return error
    }
    return res.send(users)
})

that only return matching post




回答2:


Since you are saving OP data, why not do:

// you'll need to adapt how your are getting the user-id here
const { user } = req

Post.find({ title: 'the title', 'original_poster.id': user.id }, (err, posts) => {
console.log(posts); })

Though I would advise you to adjust your Post-schema:

original_poster: {
        type: Schema.Types.ObjectId,
        ref: 'User'
    }
},

Then you can do Post.find({}).populate('original_poster') to include it in your results.!



来源:https://stackoverflow.com/questions/47467452/is-it-possible-to-query-subdocuments-directly-using-mongoose

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!