如何在mongo查找操作中获取与查询匹配的元素?

时间:2014-09-08 00:33:59

标签: arrays node.js mongodb find

我有一些这样的文件:

{
    "name" : "xxx",
    "address" : " ",
    "mail" : "",
    "url" : "",
    "pos" : {
        "lat" : yyy,
        "lng" : zzz
    },
    "rooms" : [ 
        {
            "_id" : ObjectId("540ce3f8e4b016292085b387"),
            "supplier" : "s1",
            "price" : 41000,
            "details" : [ 
                {
                    "price" : 25200,
                    "key" : "2-1"
                }, 
                {
                    "price" : 15800,
                    "key" : "2-0"
                }
            ]
        }, 
        {
            "_id" : ObjectId("540ce3f8e4b016292085b3fd"),
            "supplier" : "s2",
            "price" : 44900,
            "details" : [ 
                {
                    "price" : 27000,
                    "key" : "2-1"
                }, 
                {
                    "price" : 17900,
                    "key" : "2-0"
                }
            ]
        }, 
        {
            "_id" : ObjectId("540ce3f8e4b016292085b53d"),
            "supplier" : "s3",
            "price" : 53500,
            "details" : [ 
                {
                    "price" : 32100,
                    "key" : "2-1"
                }, 
                {
                    "price" : 21400,
                    "keykey" : "2-0"
                }
            ]
        }
    ]
}

我需要做的是使用一些过滤器和价格范围查询执行查找以仅获取匹配的数组元素而不是全部:

这是我尝试的:

var sort  = {};
var query = {name:new RegExp("xx",'i')};
query['$and'] = [{'rooms.price':{$gt:50000}},{'rooms.price':{$lt:100000}}];
var page  = 1;
var ppp   = 20; 

db.collection("myCollection").
  find(query).
  sort(sort).
  skip(page > 0 ? ((page-1)*ppp) : 0).limit(ppp).toArray(function(err, docs) {
    res.send(docs);
  });

我检索同一份文件。

我需要的是:

{
    "name" : "xxx",
    "address" : " ",
    "mail" : "",
    "url" : "",
    "pos" : {
        "lat" : yyy,
        "lng" : zzz
    },
    "rooms" : [ 
        {
            "_id" : ObjectId("540ce3f8e4b016292085b53d"),
            "supplier" : "s3",
            "price" : 53500,
            "details" : [ 
                {
                    "price" : 32100,
                    "key" : "2-1"
                }, 
                {
                    "price" : 21400,
                    "keykey" : "2-0"
                }
            ]
        }
    ]
}

我用google搜索但我发现只是聚合或map / reduce元素。

我想避免它。

有一个很好的解决方案吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您不想使用聚合或map / reduce,那么您可以更改数据结构。 将rooms提取到它自己的集合中,并确保每个元素都有来自myCollection的相应文档的id引用。这需要至少两个查询。

或者,您可以在应用程序端而不是在mongodb中过滤内容。