获取子文档Mongodb仅与条件匹配

时间:2015-07-12 16:24:41

标签: node.js mongodb express mongoose

我在mongodb中有这样的数据:

{
    "_id" : ObjectId("55a12bf6ea1956ef37fe4247"),
    "tempat_lahir" : "Paris",
    "tanggal_lahir" : ISODate("1985-07-10T17:00:00.000Z"),
    "gender" : true,
    "family" : [ 
        {
            "nama" : "Robert Deniro",
            "tempat_lahir" : "Bandung",
            "tanggal_lahir" : ISODate("2015-07-09T17:00:00.000Z"),
            "pekerjaan" : "IRT",
            "hubungan" : "XXX",
            "tanggungan" : false,
            "_id" : ObjectId("55a180f398c9925299cb6e90"),
            "meta" : {
                "created_at" : ISODate("2015-07-11T20:59:25.242Z"),
                "created_ip" : "127.0.0.1",
                "modified_at" : ISODate("2015-07-12T15:54:39.682Z"),
                "modified_ip" : "127.0.0.1"
            }
        }, 
        {
            "nama" : "Josh Groban",
            "tempat_lahir" : "Jakarta",
            "tanggal_lahir" : ISODate("2015-06-30T17:00:00.000Z"),
            "pekerjaan" : "Balita",
            "hubungan" : "Lain-Lain",
            "tanggungan" : true,
            "_id" : ObjectId("55a29293c65b144716ca65b2"),
            "meta" : {
                "created_at" : ISODate("2015-07-12T16:15:15.675Z"),
                "created_ip" : "127.0.0.1"
            }
        }
    ]
}

当我尝试在子文档中查找数据时,使用以下代码:

person.findOne({ _id: req.params.person, {'family.nama': new RegExp('robert', 'gi') }}, function(err, data){
  // render code here
});

显示家庭数据中的所有数据, 我们是否可以获取或显示仅与条件/关键字匹配的数据,例如仅限于#34; Robert Deniro"行

谢谢

2 个答案:

答案 0 :(得分:5)

常规' MongoDB,您可以使用$运算符。我不确定它是否适用于Mongoose,但值得一试:

Options +FollowSymLinks
RewriteEngine on

RewriteRule ^product/(.*)/(.*)/(.*) product.php?id=$1&c=$2&name=$3

RewriteRule ^search/(.*)/(.*)/(.*) search.php?c=$1&s=$2&page=$3

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php

RewriteCond %{THE_REQUEST} \ /+search\?c=([^&\ ]+)&s=([^&]+)
RewriteRule ^ /search/%1/%2? [L,R]

如果您需要父文档中的任何属性(person.findOne({ _id : req.params.person, 'family.nama' : new RegExp('robert', 'gi') }, { // Only include the subdocument(s) that matched the query. 'family.$' : 1 }, function(err, data){ // render code here }); tempat_lahirtanggal_lahir; gender将始终包含在内),您需要将它们添加到投影对象明确。

有一点需要注意:_id运算符只会从数组中返回第一个匹配文档。如果您需要它来返回多个文档,则无法使用此方法,并且(AFAIK)必须在从数据库返回结果后对结果进行后处理。

答案 1 :(得分:0)

用这段代码解决了:

var options = {
  family: {
    $elemMatch: { nama: req.query.keyword }
  },
};

person.findOne({ _id: req.params.person, 'family.nama': keyword }, options, function(err, data){
  //render code here
});

感谢@hassansin& @robertklep