【问题标题】:Get one element from an array of objects that's part of one document (mongoose)从属于一个文档的对象数组中获取一个元素(猫鼬)
【发布时间】:2017-05-12 06:03:07
【问题描述】:

我有一个包含 Friends 的架构。 Friends 是一个数组,其中每个元素都是一个包含 id、gender 和 emoji 的对象。

var userSchema = new Schema({
    id: {
        type: String,
        unique: true,
        required: true
    },
    gender: String,

    Friends: [{
        id: String
        gender: String
        emoji: String

    }]

});

在下面的代码中,我正在访问一个包含 Friends 数组的文档,并使用 distinct 指定搜索,这样它只显示文档的 Friends 数组。我只需要访问该数组中包含指定 id 的一个元素。不是像在代码中那样在查询之后过滤该数组,有没有办法只从查询中获取元素?换句话说,是否有一个额外的功能来区分或某种允许这样做的猫鼬运算符?

User.findOne().distinct('Friends', { id: req.body.myId }).then(function(myDoc) {

    var friendAtt = myDoc.filter(function(obj) {
        return obj.id == req.body.id
    })[0]

})

【问题讨论】:

  • 听说过 MongoDB 聚合框架吗??
  • 从来没有我的朋友,在我开始研究之前有什么提示吗?

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

感谢 bertrand,我发现答案就在“Projection”中。在 mongodb 中是 '$',在 mongoose 中是 select。以下是我的工作方式:

User.findOne({id: req.body.myId}).select({ Friends: {$elemMatch: {id: req.body.id}}}),

它只返回与friends中指定的id匹配的元素。

【讨论】:

  • 这会返回一个数组,但只有与您的 $elemMatch 匹配的元素,(在我的情况下,因为 id 是唯一的,一个元素)
  • 你救了我,天哪,我也在寻找那个太郎。
【解决方案2】:

您在这里并不需要distinct,您可以在Friends.id 上使用find(),并使用the positional parameter $ 过滤匹配Friends.id 的第一个子文档:

db.user.find(
    { 'id': 'id1', 'Friends.id': 'id2'},
    { 'Friends.$': 1 }
)

在猫鼬中:

User.find({ 'id': req.body.myId, 'Friends.id': req.body.id }, { 'Friends.$': 1 }).then(function(myDoc) {
    console.log("_id   :" + myDoc[0].Friends[0].id);
    console.log("gender:" + myDoc[0].Friends[0].gender);
})

【讨论】:

猜你喜欢
  • 2022-12-23
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 2022-08-02
  • 1970-01-01
  • 2016-04-01
相关资源
最近更新 更多