【问题标题】:How to get just element that matches query in a mongo find operation? [duplicate]如何在 mongo 查找操作中仅获取与查询匹配的元素? [复制]
【发布时间】:2014-09-08 00:33:58
【问题描述】:

我有一些这样的文件:

{
    "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"
                }
            ]
        }
    ]
}

我搜索了一下,但我发现只是聚合或映射/减少元素。

我想避免它。

有好的解决办法吗??

谢谢!

【问题讨论】:

    标签: arrays node.js mongodb find


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-01-26
      • 2020-06-01
      • 2023-03-11
      • 2012-05-30
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 2016-02-24
      相关资源
      最近更新 更多