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

Ram*_*pak 0 mongoose mongodb node.js express

我在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"
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢

rob*_*lep 5

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

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
});
Run Code Online (Sandbox Code Playgroud)

如果您需要父文档中的任何属性(tempat_lahir,tanggal_lahirgender; _id将始终包含),则需要显式地将它们添加到投影对象.

一个警告:$操作员只返回数组中的第一个匹配文档.如果需要它来返回多个文档,则无法使用此方法,并且(AFAIK)必须在从数据库返回结果后对结果进行后处理.