Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Node.js Mongodb。方法来限制仅具有“投影”(即筛选器)的给定字段的子文档?_Node.js_Mongodb - Fatal编程技术网

Node.js Mongodb。方法来限制仅具有“投影”(即筛选器)的给定字段的子文档?

Node.js Mongodb。方法来限制仅具有“投影”(即筛选器)的给定字段的子文档?,node.js,mongodb,Node.js,Mongodb,因为在MongoDB中无法筛选子文档(参考:) MongoDB中是否有其他方法/方法可以快速删除/过滤没有给定字段、没有下例中的子文档字段的字段 唯一的方法是在mongodb的外部处理结果并过滤掉所有空文档吗 (想象一下这样一种情况,当你有1000个子文档,它们的模式各不相同。我使用.find()得到1000个子文档,但900个子文档是空的。我只想得到100个子文档,所以我不必总是在MongoDB之外处理和丢弃空的子文档。) 例如,您有一个JSON,它位于名为monday的集合中: { docu

因为在MongoDB中无法筛选子文档(参考:)

MongoDB中是否有其他方法/方法可以快速删除/过滤没有给定字段、没有下例中的
子文档
字段的字段

唯一的方法是在mongodb的外部处理结果并过滤掉所有空文档吗

(想象一下这样一种情况,当你有1000个子文档,它们的模式各不相同。我使用.find()得到1000个子文档,但900个子文档是空的。我只想得到100个子文档,所以我不必总是在MongoDB之外处理和丢弃空的子文档。)

例如,您有一个JSON,它位于名为monday的
集合中:

{
document : [
            {
             subdocument : "Hello World"
            },
            {
             subdocument : "Hello Moon"
            },
            {
             another_field: "Hello Sun"
            }
            ]
}
然后进行这个查询
db.monday.find({},{u id:0,“document.subdocument”:1})

结果将是:

    { "document" : [    
    {   "subdocument" : "Hello World" },    
    {   "subdocument" : "Hello Moon" },     
    {    } 
    ] }

您可以看到,另一个_字段仍然返回,尽管它是空的

我认为在这种情况下会返回空字段,因为文档是一个数组,Mongodb不想更改任何元素的数组索引

您可以使用聚合框架获取子文档数组:

db.monday.aggregate(
  [
    { $match: 
      {'document.subdocument' : 
        { $exists: 1 }
      }
    },
    { $unwind: "$document" }, 
    { $match: 
      {'document.subdocument' : 
        { $exists: 1 }
      }
    },
    { $project: { subdocument: "$document.subdocument", _id: 0 } }
  ])
收益率:

 [
    {
        "subdocument" : "Hello World"
    },
    {
        "subdocument" : "Hello Moon"
    }
 ]

第一个
$match
不是必需的,如果有很多文档没有您要查找的任何子文档,它只会加快处理速度。

是的,您完全正确。Mongodb不想更改索引。我想要的是数据库端过滤器只获取子文档。想象一下这样一种情况:有一千个子文档具有不同的模式。我做了一个db.monday.find()并得到1000个子文档,但900个子文档是空的。我只想得到100,所以我不必总是处理和删除空的。答案更新为只返回子文档。如果希望文档ID与项目一起使用,请删除
$project
。(参见本答案第二版)简直太棒了!我刚测试过。(我现在必须进一步探索聚合框架。)