我有这样的反对意见:

{    
    "_id": {
        "$oid": "654625943108039f4960125b"
    },
    "text": "c1",
    "replies": [{
        "parentCommentId": {
            "$oid": "654625943108039f4960125b"
        },
        "replyId": "f2ff36d9-ce4f-468c-98dd-0e6a0acf85c0",
        "text": "c1-r1-r1-r3",
        "immediateParent": "b0b1dda0-493a-473b-bc11-7efc9935e4fe",
        "ancestors": [{
            "parentReplyId": "b0b1dda0-493a-473b-bc11-7efc9935e4fe",
            "commentId": "654625943108039f4960125b"
        }]
    }, {
        "parentCommentId": {
            "$oid": "654625943108039f4960125b"
        },
        "replyId": "5ecd2ce9-5347-4722-86d4-e35e52fbb3ef",   
        "text": "sample1",
        "immediateParent": "312e2000-2793-4be7-8a20-f782d32401cc",
        "ancestors": [{
            "parentReplyId": "312e2000-2793-4be7-8a20-f782d32401cc",
            "commentId": "654625943108039f4960125b"
        }]
 }

我想在Mongo 从上面的物体中找到replyId: 5ecd2ce9-5347-4722-86d4-e35e52fbb3ef个.

我try 这样做,但它返回所有对象:

const replies = await genericDb.collection('comments').findOne(
    { _id: new ObjectId(commentId), 'replies.replyId': replyId },
    { 'ancestors.$': 1 }
);

最新情况:

try 了聚合管道,但仍未成功

const ancestors = await genericDb.collection('comments').aggregate([
    { $match: { _id: new ObjectId(commentId), "replies.replyId": replyId } },
    { $unwind: "$replies.ancestors" },
]).toArray();

推荐答案

如果您只想从符合replyId条件的replies数组中挑选出对象,则需要使用$elemMatch,这将允许您使用$位置运算符.Aggregate的能力要强得多,但这里有一个find()的例子:

const replies = await genericDb.collection('comments').find({
  "_id": ObjectId(commentId),
  "replies": {
    $elemMatch: {
      "replyId": replyId
    }
  }
},
{
  "replies.$": 1,
  // "replies.ancestors.$": 1, //< or with just ancestors
  "_id": 0
})

有关工作示例,请参见HERE.

Mongodb相关问答推荐

会话的Mongo-go驱动程序版本.Copy()

如何使用mongodb进行离线开发?

Kotlin 使用初级构造实例化公开类

Mongodb Timeseries / Golang - ['timestamp' 必须存在并包含有效的 BSON UTC 日期时间值]

避免在 MongoDB 聚合框架中使用 ISODate() 以便管道可以是纯 JSON

使用新字段插入数据或使用 updateOne mongodb 有条件地更新

没有mongoose 的 Express 和 MongoDB

为什么一个 mongodb 副本集需要奇数个投票 node ?

mongoDB vs mySQL - 为什么在某些方面比另一个更好

findOneAndUpdate 和 findOneAndReplace 有什么区别?

如何使用 Spring Data MongoDB 通过 GridFS ObjectId 获取二进制流

如何检索 MongoDb 集合验证器规则?

从性能Angular 来看 MongoDB 嵌入式与参考

如何对连接到 mongo 的方法进行单元测试,而不实际连接到 mongo?

错误:Could not connect to any servers in your MongoDB Atlas cluster

一起使用 MongoDB 和 Neo4j

在 Ubuntu 13.10 (saucy) 中安装 Mongodb PHP 扩展的最简单方法?

如何在 MongoDB 中删除此弃用警告,为什么会这样?

pre save和validate之间的mongoose区别?什么时候用哪一个?

有没有办法防止 MongoDB 向集合名称添加复数形式?