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

使用mongoose基于子文档的一个属性返回子文档

欧阳高昂
2023-03-14

使用mongoose,我希望搜索具有特定属性的子文档并返回最近的一个。

// the relevant part of the user schema
id: String,
__history__: {
    reply: []
}

// the components of a 'reply' (not defined by a schema)
id: String,
createdAt: Date,
props {
    tipID: String
}

给定一个特定的用户id,我想搜索他们的reply[]s,查找他们的道具中有tipID的回复。然后,我想返回包含最新的createdAtreplytipID

一般来说,我不熟悉井式编码。我想知道如何最好地解决这个问题。


共有3个答案

祁兴运
2023-03-14

因为$elemMatch返回了一个错误(我想是因为reply不是一个正确的模式定义的文档),所以我改为使用以下内容。

User.findOne("_id": user._id}, function (err, doc) {
    var replies = doc.__history__.reply;
    for ( var i = 0; i < replies.length; i++ ) {
        if (replies[i].props.hasOwnProperty("tipId")) {
            // do something
            break; // stop because i only wanted the first hit
    }
}

注意:我不必担心按时间排序,因为\uuu history\uuuu.reply项目已经由最新的first订购。

封飞
2023-03-14

如果您只找到一个文档,请按如下方式组织回复。。

// find your doc by ID
user.findOne({ id: id }, function(err, doc) {
    // sort replies by createdAt date
    var replies = _.sortBy(doc.reply, function(reply) {
        return reply.createdAt.getTime(); // convert to seconds from jan 1, 1970
    });

    return replies[0].props.tipId;
})
卜鹏
2023-03-14

这是一个重复的问题,猫鼬通过标准查找子文档

对于您的具体问题,猫鼬子文档的技巧有两个:

a) 如果可以,请避免嵌套在子文档中,即不要将属性嵌套在propId中,而是直接将这些属性放入回复中,不管它们是什么。

b)使用$elemMatch,正如我上面引用的重复答案中建议的那样。这将确保mongoDb找到正确的文档,因为mongoDb将{a: 1, b: 2}{b: 2, a: 1}识别为两个不同的子文档。

 类似资料:
  • 我有一份这样的文件: 我想通过将其与数量字段(2*800)相乘来更新价格字段,其中的结果将更新/分配给价格。(对于本例,价格更新为1600)。 更新后的文档: 我的选择查询如下: 我怎样才能做到这一点?

  • 我试图更新一个子文档(有效),然后更新除上一个子文档之外的多个子文档。基本上,每次

  • 我想使用mongoose从多个文档更新多个子文档。 我目前的代码是: 模式的一部分是: 但是这段代码只更新id arr中的最后一个元素。

  • 我有一份这样的文件 上面的文档可以这样概括如下,便于理解。 我需要增加nums子文档中数量的值,该值位于产品子文档中,基于其\u id。 这是我迄今为止所尝试的,但它不起作用,因为我不知道如何捕获nums对象内的\u id,以便更新子子文档数组中的特定对象。 我怎样才能做到这一点?

  • 问题内容: 使用Mongoose可以一次性在一个(子)文档上设置多个属性吗?我正在尝试做的一个例子: 假设我有以下架构: 然后我想做: 通常,我可以使用运算符来实现此目的,但是我的问题是在此示例中是的子文档(嵌入式架构)。所以当我尝试去做 它替换了由标识的子文档实例。目前,我已经通过手动设置仅字段来“解决”它,但是我希望有一种更好的方法来做到这一点。 问题答案: 基于的字段以编程方式构建对象,以使

  • 问题内容: 我正在尝试从猫鼬文档中存储的集合中删除一项。我的文档如下所示: 我想删除SKU为12的金鱼。我正在执行以下操作: 当我这样做时,出现错误“ TypeError:无法读取未定义的属性’等于’”。我不明白为什么。 问题答案: 您需要,然后打个电话。用于顶级文档