所以我过去 2 天都在研究这个,我快疯了,这是我的代码(部分):
const mongoose = require('mongoose')
mongoose.connect('',{
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false
})
const postsSchema = new mongoose.Schema({
_id: String,
posts: Array,
upvotes: Number,
downvotes: Number,
fans: Array,
dmUserWhenUpvoted: Boolean,
dmUserWhenDownVoted: Boolean
})
const postsModel = mongoose.model("Posts",postsSchema)
/**
*
* @param {Object} user
*/
async function getPosts(user){
if(!user) user = message.author
let posts = await postsModel.findOne({_id: user.id})
if(posts === null){
let newData = new postsModel({
_id: user.id,
posts: [],
upvotes: 0,
downvotes: 0,
fans: [],
dmUserWhenUpvoted: false,
dmUserWhenDownVoted: false
})
await newData.save()
posts = await postsModel.findOne({_id: user.id})
}
return {
_id: user.id,
posts: posts.posts,
upvotes: posts.upvotes,
downvotes: posts.downvotes,
fans: posts.fans,
dmUserWhenUpvoted: posts.dmUserWhenUpvoted,
dmUserWhenDownVoted: posts.dmUserWhenDownVoted,
account: posts
}
}
这些是我用来推送的两种方法:
let getposts = await getPosts()
postsModel.updateOne(
{_id: message.author.id},
{
"$push": {
"posts": {
id: s.id,
upvotes: 0,
downvotes: 0
},
}
},
function(err, response) {
console.log(err)
console.log(response)
}
)
console.log(getposts.account)
await message.delete()
当我登录 posts.account 并且错误日志为 null
方法二:
let getposts = await getPosts()
getposts.account.posts.push({
id: s.id,
upvotes: 0,
downvotes: 0
})
await getposts.account.save(function(err){
console.log(err)
});
console.log(getposts.account)
await message.delete()
当我登录 getposts.account 时,它会记录其中包含推送对象的数组(帖子),但是当我转到我的仪表板并查看我的收藏时,它是空的。希望有人能帮我解决我的问题,这个问题 only
出现在这部分代码中,我使用方法 2 将我所有的东西推送到不同的集合中,并且它有效
答案 0 :(得分:0)
好的,事实证明您实际上甚至不需要使用 posts: [new mongoose.Schema({}, {versionKey: false, _id: false})]
指定任意 mongoose 对象的数组。这将完成相同的工作:posts: Array
,无论如何,这就是您最初拥有的。
假设您的 Posts
集合中只有一个文档:
{
"_id" : ObjectId("6039b9ff08e0c46c9c04f963"),
"fans" : [ ],
"posts" : [ ],
"upvotes" : 0,
"downvotes" : 0,
"dmUserWhenUpvoted" : false,
"dmUserWhenDownVoted" : false,
}
如您所见,posts
字段为空。要将新的帖子对象推送到其中,您将需要此代码(或其变体):
const postsModel = mongoose.model('Posts');
const addPosts = () => {
postsModel.findOne({_id: '6039b9ff08e0c46c9c04f963'})
.then(post => {
post.posts.push({
id: 'some_id_here',
upvotes: 0,
downvotes: 0
})
post.save()
})
}
addPosts()
我更像是一个then
人,但如果你更喜欢await
ing,它看起来像这样:
const postsModel = mongoose.model('Posts');
const addPosts = async () => {
const post = await postsModel.findOne({_id: '6039b9ff08e0c46c9c04f963'})
post.posts.push({
id: 'some_id_here_1',
upvotes: 0,
downvotes: 0
});
await post.save();
return 'ok';
}
addPosts().then(r => console.log(r))