我一直在关注this documentation,我试图在这里实现它:
customers.find({'name':tenantName,'scripts.author':author},'scripts',function(err,data2){
但是这并没有找到我想要的东西。我会回复scripts
的每个元素,无论scripts.author
是否匹配。
我做错了什么?
我的数据看起来像这样
{
name: "something"
scripts:[
{author:"something", data:"data"},
{author:"something else" data:"data2"},
{author:"something", data:"data3"}
]
}
我希望scripts
author
匹配我给它的所有内容
答案 0 :(得分:1)
这里有一些问题让你理解匹配这样的查询。首先,你想要做的是:
customer.find(
{ "name":tenantName, "scripts.author": author },
{ "scripts.$" },
function(err,data2) {
// work here
})
这将使用positional $
运算符来匹配元素。但这里的问题是只匹配数组的第一个元素。这在文档中有所涉及。结果将是这样的:
{ "scripts" : [ { "author" : "something", "data" : "data" } ] }
如果您需要匹配 muliple 元素,那么您需要使用聚合函数来过滤数组内容:
customer.aggregate([
// Match just the documents you want
{ "$match": { "name": tenantName, "scripts.author": author } },
// Unwind the array
{ "$unwind": "$scripts" },
// Match to filter just the array elements
{ "$match": { "scripts.author": author } },
// Push back the array elements
{ "$group": {
"_id": "$_id",
"name": { "$first": "$name" },
"scripts": { "$push": "$scripts" }
}}
],
function(err,result) {
})
结果会有两个元素匹配"某些东西"作为author
。
为什么这一切?那么提到的投影可以做什么就有限制。但主要原因是你数组中的不匹配元素,但是你匹配"包含&#34的文档 ;数组中的匹配元素。
因此,如果你真的想要过滤结果,你就是这样做的。