gpt4 book ai didi

mongodb - 如何从数组内的文档中投影特定字段?

转载 作者:IT老高 更新时间:2023-10-28 13:15:22 32 4
gpt4 key购买 nike

这是一个典型的文档

{
title : 'someTitle',
places : [{name : 'someName', location : 'someLocation'}, {name ...}]
}

我有以下查询

var qs = {title : 'someTitle', places : {$elemMatch : {name : 'someName' } } };

我选择一个与标题匹配的文档,并且在其“places”数组中包含一个名称等于“someName”的文档条目。但是问题是places 数组中的条目是大型文档,我只需要该文档中的几个字段。我尝试像这样投影字段,但它不起作用。

var projection = {'places.$.name': 1, 'places.$.location' : 1};

它应该返回一个数组,其中的文档只包含 'name''location' 属性。

我收到以下错误

Can't canonicalize query: BadValue Cannot specify more than one positional proj. per query.  

说清楚,我想在没有聚合框架的情况下完成这个

最佳答案

你做错了。根据documentation

Only one positional $ operator may appear in the projection document.

但您仍然需要使用 $操作符得到预期的结果:

var qs = { title : 'someTitle', 'places.name' : 'someName' };
var projection = {'places.$': 1 };
db.collection.find(qs, projection);

返回:

{
"_id" : ObjectId("564f52d7d9a433df958b5630"),
"places" : [
{
"name" : "someName",
"location" : "someLocation"
}
]
}

你也不需要 $elemMatch 操作符在这里使用 "dot notation"而是。


现在,如果您想要的是数组中每个子文档的“名称”和“位置”数组,那么聚合就是要走的路。

db.collection.aggregate([
{ '$match': {
'title' : 'someTitle',
'places.name' : 'someName'
}},
{ '$project': {
'places': {
'$map': {
'input': '$places',
'as': 'place',
'in': {
'name': '$$place.name',
'location': '$$place.location'
}
}
}
}}
])

产量:

{
"_id" : ObjectId("564f52d7d9a433df958b5630"),
"places" : [
{
"name" : "someName",
"location" : "someLocation"
},
{
"name" : "bar",
"location" : "foo"
}
]
}

关于mongodb - 如何从数组内的文档中投影特定字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33831665/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com