从属于一个文档的对象数组中获取一个元素(猫鼬)

Posted

技术标签:

【中文标题】从属于一个文档的对象数组中获取一个元素(猫鼬)【英文标题】: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 聚合框架吗?? 从来没有我的朋友,在我开始研究之前有什么提示吗? 【参考方案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);
)

【讨论】:

'Friends.$' : 1' 部分 来自docs.mongodb.com/v3.0/reference/operator/projection/positional。我认为 mongoose 文档中没有示例 这并不能真正在猫鼬 Bertrand 中编译。 'Friends.$' : 1' 部分。然而,这确实让我知道在哪里看! 这是一个测试:gist.github.com/bertrandmartel/a3a90fed2a6b6cbd624bad9e7c7e8fd2

以上是关于从属于一个文档的对象数组中获取一个元素(猫鼬)的主要内容,如果未能解决你的问题,请参考以下文章

如何避免在对象内部创建对象并使用猫鼬将元素直接推送到快速数组中?

猫鼬在循环中获取多个对象

猫鼬更新对象数组中匹配条件的元素的值

数组对象元素的添加,String对象,BOM对象以及文档对象的获取

使用投影或选择更新猫鼬文档中对象数组内的对象

如何将对象响应对象的猫鼬聚合数组转换为json对象响应