当前位置: 首页 > 知识库问答 >
问题:

如何在Mongoose中将一个元素推入另一个数组中的对象内部的数组?

太叔岳
2023-03-14

我正在开发一个使用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推入其中?

共有1个答案

庾才
2023-03-14

下面是我将如何解决您的问题,我首先将重新定义我定义模式的方式。

我的用户架构将如下所示

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的人有用。选中的答案很容易。 问题答案: 您可以使用函数的参数来避免将过滤器数组存储在全局变量中。