MongoDB:如何通过_id查询字段数组

时间:2016-12-07 16:20:11

标签: node.js mongodb mongoose

如何通过_id获取特定消息。 我有一个数据库模式,如下所示:

{
    "_id": ObjectID("5846eedaf0b51ed02ed846e2"),
    "name": "conversation name"
    "messages": [
        {
            "_id": ObjectID("584820a96866b6283361a4b9"),
            "content": "hello",
            "status": 0,
            "type": 0
        },
        {
            "_id": ObjectID("584820d56866b6283361a4ba"),
            "content": "voices/1481122005696.mp3",
            "status": 0,
            "type": 3
        }
    ]
}

2 个答案:

答案 0 :(得分:1)

db.collection.find({}, {
    'messages': {
        $elemMatch: {
            '_id': ObjectId("584820a96866b6283361a4b9")
        }
    }
})

这将匹配集合中的所有文档,并返回投影中的匹配数组子字段。请参阅Yogesh评论中发布的链接。

答案 1 :(得分:1)

由于您标记了mongoose,我这样说,但查询语法有效,因为它是mongoDB查询语法的一部分:

Conversation.findOne({
  "messages._id": "584820a96866b6283361a4b9"
}, function(err, document){
    if (err) {
        console.log(err) 
        return
    }
    var message = document.messages.id("584820a96866b6283361a4b9")
})

finOne() method将返回包含所有消息(子文档)和其他属性的完整父文档。然后,您需要筛选出子文档。 Mongoose提供了一种方法,可以使用document.messages.id("584820a96866b6283361a4b9")轻松完成此操作,其中document将是传递给find回调的数据对象

请参阅: 匹配字段而不指定数组索引 https://docs.mongodb.com/v3.2/tutorial/query-documents/#query-on-arrays