我正在开发一个使用Expressjs、Mongodb和Mongoose的服务器。我需要将一个元素(字符串)推入“tweets”数组,该数组位于对象(朋友)内部,而对象(朋友)又位于“friends”数组内部,而“friends”数组位于“users”对象内部,该对象在“users”集合中记录。下面是Mongodb集合中的文档的示例:
{
"loggedIn": true,
"_id": "5f91ef0ce75d3b1d40539da0",
"username": "username",
"email": "a@h.com",
"password": "$2a$10$9krWS9Kq5024lRTexqaweePrn8aughepqTkaj3oA48x0fJ2ajd79u",
"dateOfBirth": "2002-12-07",
"gender": "male",
"friends": [
{
"tweets": [],
"_id": "5f91effae75d3b1d40539da7",
"username": "Jonas"
},
],
"__v": 0
}
我需要首先从“users”数组中选择指定的用户名,然后访问这个用户中的“friends”数组,然后选择正确的friends对象,最后在这个数组中的$position:0上推送tweet。我试图实现这一点,如这段代码所示,我可以使用给定的friendUsername访问Friender对象
await Users.updateOne(
{ username: req.params.username },
{
$push: {
friends: {
$elemMatch: {
username: req.params.friendUsername,
},
},
},
}
);
现在的问题是如何访问$elemmatch中的“tweets”数组,并将$position:0处的req.body.tweet推入其中?
下面是我将如何解决您的问题,我首先将重新定义我定义模式的方式。
我的用户
架构将如下所示
user.js
const mongoose = require('mongoose')
const UserSchema = mongoose.Schema({
...
friends: {
type: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}],
required: true,
default: []
},
tweets: {
type: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Tweet'
}],
required: true,
default: []
},
...
}, {timestamps: true})
module.exports = mongoose.model('User', UserSchema)
const mongoose = require('mongoose')
const TweetSchema = mongoose.Schema({
...
text: {
type: String,
required: true
},
tweeter: {
type: mongoose.Schema.Types.ObjectId,
required: true,
ref: 'User'
},
likes: {
type: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
}],
required: true,
default: []
},
...
}, {timestamps: true})
module.exports = mongoose.model('Tweet', TweetSchema)
这假设每个用户都可以有tweets,并且用户
可以是另一个用户
的好友
现在如果有人在推特上发了一些东西,你可以做一些类似的事情
const Tweet = require('./Tweet.js')
const User = require('./User.js')
let tweet = new Tweet({
text: "My first tweet!",
tweeter: "ID Of user who is posting the tweet"
})
tweet.save()
// Now update the user who tweeted
User.findOneAndUpdate()
User.updateOne({ _id: "ID Of user who is posting the tweet" }, { $push: { tweets: tweet._id } })
现在,只要你请求一个用户,他的所有朋友都将被引用,他们的所有推文也将被引用!如果您想要查看实际的tweets,请使用.populate()
以下是.populate()
的文档https://mongoosejs.com/docs/populate.html
如果上面的方法没有帮助,并且您仍然希望通过模式来实现目标,那么类似这样的方法就会起作用(假设您的模式名为user
)
let tweetObj = {}
User.updateOne({_id: 'your userid'}, {$push: {"friends.$.tweets": tweetObj}})
注意:我省略了回调,因为它们与问题无关
我正在使用mongoose将一个玩家推入mongoose中的玩家数组,当一个玩家加入游戏时。我收到以下错误:
问题内容: 说我有这些二维数组A和B。 如何从B中删除A中的元素。(集合论中的补语:AB) 更准确地说,我想做这样的事情。 问题答案: 基于this solution对,这里是用更少的内存占用与NumPy基础的解决方案,并与大型阵列工作时,可能是有益的- 样品运行- 在大型阵列上的运行时测试- 具有基础解决方案的时间- 基于更少内存占用量的定时解决方案- 进一步提升性能 通过将每一行视为索引元组来
问题内容: 考虑以下嵌套类。 问题答案: 您可以像这样声明一个对象数组。 并实例化它们,您可以在类中执行类似的操作。
下面是一个动态数组。现在我想为“BHD0000000002”编辑一个特定的数组。我通过ajax请求获得以下数组。但是,我无法编辑内部数组元素。例如,我试图编辑键“BHD0000000002”的内部数组值,但无法解决问题。有人能帮忙吗,先生/女士? 这是原始数组: : 到目前为止,我已经尝试了以下代码,但它不起作用。有人能帮忙吗?
问题内容: 我有两个数组,我想检查是否每个元素都在中。如果元素的值在中重复,则该元素的值必须相等。最好的方法是什么? 问题答案: 一种选择是对两个数组进行排序,然后遍历两个数组,然后比较元素。如果在超级袋中未找到子袋候选中的元素,则前者不是子袋。排序通常为O(n *log(n)),比较为O(max(s,t)),其中 s 和_t_是数组大小,总时间复杂度为O(m * log(m)) ,其中m =ma
问题内容: 我想了解 从另一个数组的所有元素过滤数组 的最佳方法。我尝试使用过滤器功能,但是如何给它提供要删除的值并没有解决。 就像是: 如果过滤器功能没有用,您将如何实现呢? 编辑:我检查了可能重复的问题,它可能对那些容易理解javascript的人有用。选中的答案很容易。 问题答案: 您可以使用函数的参数来避免将过滤器数组存储在全局变量中。