Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将表达式应用于文档中的每个数组元素_Javascript_Mongodb_Aggregation Framework - Fatal编程技术网

Javascript 将表达式应用于文档中的每个数组元素

Javascript 将表达式应用于文档中的每个数组元素,javascript,mongodb,aggregation-framework,Javascript,Mongodb,Aggregation Framework,我有一个示例文档,我正试图在MongoDB聚合管道中投影它。我使用一个大致如下的文档进行测试: { "_id" : "", "title" : "Questions", "sortIndex" : 0, "topics" : [ { "_id" : "", "title" : "Creating a Question", "sortIndex" : 1,

我有一个示例文档,我正试图在MongoDB聚合管道中投影它。我使用一个大致如下的文档进行测试:

{
    "_id" : "",
    "title" : "Questions",
    "sortIndex" : 0,
    "topics" : [ 
        {
            "_id" : "",
            "title" : "Creating a Question",
            "sortIndex" : 1,
            "thumbnail" : "CreatingAQuestion.jpg",
            "seenBy" : [ "user101", "user202" ],
            "pages" : [ 
                {
                    "visual" : "SelectPlanets.gif",
                    "text" : "Some Markdown"
                }
            ]
        }, 
        {
            "_id" : "",
            "title" : "Deleting a Question",
            "sortIndex" : 0,
            "thumbnail" : "DeletingAQuestion.jpg",
            "seenBy" : [ "user101" ],
            "pages" : [ 
                {
                    "visual" : "SelectCard.gif",
                    "text" : "Some Markdown"
                }
            ]
        }
    ]
}
我试图获得的结果大致如下:

{
    "_id" : "",
    "title" : "Questions",
    "topics" : [ 
        {
            "title" : "Creating a Question",
            "thumbnail" : "CreatingAQuestion.jpg",
            "seen" : true
        }, 
        {
            "title" : "Deleting a Question",
            "thumbnail" : "DeletingAQuestion.jpg",
            "seen" : false
        }
    ]
}
具体来说,我正在努力解决的是
seen
标志

我已经阅读了以下国家的报告:

在嵌入文档中投影或添加/重置字段时

。。。也可以嵌套字段:

联系人:{地址:{国家:}}

我希望使用一个表达式,我注意到以下几点:

嵌套字段时,不能在嵌入文档中使用点符号来指定字段,例如,联系人:
{“address.country”:}
无效

因此,我试图找出如何在表达式中“引用”子文档字段。这句话表明我不能使用点表示法,但当我似乎也不能使用嵌套表示法时。以下是到目前为止我得到的信息:

db
    .getCollection('chapters')
    .aggregate([
        {
            $project: {
                title: 1,
                topics: {
                    title: 1,
                    thumbnail: 1,
                    publishedAt: 1,
                    test: "$seenBy",
                    seen: { $in: ["user202", "$seenBy"] },
                }
            }
        }
    ])
因此,我现在已经将
user202
硬编码到我的查询中,并希望看到这两个文档的truefalse。我还输入了一个
test
字段来映射子文档中的
seenBy
字段。这产生的结果是:

{
    "_id" : "",
    "title" : "Questions",
    "topics" : [ 
        {
            "title" : "Creating a Question",
            "thumbnail" : "CreatingAQuestion.jpg",
            "test" : [ 
                "user101", 
                "user202"
            ],
            "seen" : true
        }, 
        {
            "title" : "Deleting a Question",
            "thumbnail" : "DeletingAQuestion.jpg",
            "test" : [ 
                "user101", 
                "user202"
            ],
            "seen" : true
        }
    ]
}
很明显,我的“$seenBy”没有访问正确的主题,因为
test
字段包含第一个文档中的数据

因此,最终我的问题是,如何访问子文档中的
seenBy
字段,引用当前的子文档,以便创建表达式

注意:我使用了多个
$project
和一个
$unwind
,但想尝试压缩/清理一下。

您确实需要在这里使用它。当您需要当前元素的本地化值时,简单地在投影中标记数组(这有点像MongoDB 3.2)并不能真正切割它。这就是您所需要的,也是您所提供的:

db.getCollection('chapters').aggregate([
   { $project: {
     title: 1,
     topics: {
       $map: {
         input: "$topics",
         as: "t",
         in: {
           title: "$$t.title",
           thumbnail: "$$t.thumbnail",
           publishedAt: "$$t.publishedAt",
           test: "$$t.seenBy",
           seen: { $in: ["user202", "$$t.seenBy"] },
        }
      }
   }}
])

因此,对于每个元素,
“seenBy”
的当前值作为一个属性正在通过表达式进行测试。如果没有标记,这是不可能的,您只能真正地标记“整个”数组。这并不是您想要在这里测试的内容。

非常感谢,以前没有使用过
$map
,但考虑到它的用途,它非常适合。我认为这些文件只是把我引向了错误的道路,因为听起来我应该能够做我想做的事情。