如何在匹配两个条件的数组中查找集合的所有元素

时间:2014-03-21 22:19:35

标签: javascript node.js mongodb mongoose aggregation-framework

我一直在关注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匹配我给它的所有内容

1 个答案:

答案 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的文档 ;数组中的匹配元素。

因此,如果你真的想要过滤结果,你就是这样做的。