我是mongo新手,我试图在这个集合中做一个非常简单的查询:
{
"_id" : ObjectId("gdrgrdgrdgdr"),
"administrators" : {
"-HGFsfes" : {
"name" : "Jose",
"phone" : NumberLong(124324)
},
"-HGFsfqs" : {
"name" : "Peter",
"phone" : "+43242342"
}
},
"countries" : {
"-dgfgrdg : {
"lang" : "en",
"name" : "Canada"
},
"-grdgrdg" : {
"lang" : "en",
"name" : "USA"
}
}
}
如何进行查询以返回名称为“%Jos%”的管理员的结果。
到目前为止,我所做的是:db. getCollection('coll')。查找({"administrators.name": /Jos/});
还有这个的变体。但是我尝试的每一件事都没有结果。
我做错了什么?
提前感谢!
你的错误是管理员不是一个数组,而是一个带有字段的对象,这些字段本身就是带有名称字段的对象。右查询将是
{ "administrators.-HGFsfes.name": /Jos/}
不幸的是,这样您只查询-HGFsfes名称字段,而不是其他管理员名称字段。
为了实现您想要的,唯一要做的就是用数组替换管理员对象,因此您的文档将如下所示:
{
"administrators" : [
{
"id" : "-HGFsfes",
"name" : "Jose",
"phone" : 124324
},
{
"id" : "-HGFsfqs",
"name" : "Peter",
"phone" : "+43242342"
}
],
countries : ...
}
这样您的查询就可以工作了。
但它会返回管理员数组中至少有一个条目具有匹配名称字段的文档。要仅返回管理员匹配元素,而不是整个文档,请检查此问题和我对unwinder/match/group聚合管道的回答。
您需要像这样使用查询:
db.collection_name.find({})
因此,如果您的集合名称是coll,那么它将是:
db.coll.find({"administrators.-HGFsfes.name": /Jos/});
在mongo中查找类似查询。
另外,尝试使用如下正则表达式模式:
db.coll.find({"administrators..-HGFsfes.name": {"$regex":"Jos", "$options":"i"}}});
如果你想要多个结果,那么你需要重组你的数据。
好的,我想我已经为您找到了一个更好的解决方案,使用聚合框架。在您当前的集合上运行以下查询,将返回所有名称为“喜欢”jos的管理员(i选项不区分大小写):
db.test1.aggregate(
[
{
$project: {
administrators:{ $objectToArray: "$administrators"}
}
},
{
$unwind: {
path : "$administrators"
}
},
{
$replaceRoot: {
newRoot:"$administrators"
}
},
{
$match: {
"v.name":/jos/i
}
},
]
);
输出
{
"k" : "-HGFsfes",
"v" : {
"name" : "Jose",
"phone" : NumberLong(124324)
}
}
“k”和“v”来自“$object tToArray”运算符,您可以添加$project阶段来重命名它们(如果k值无关紧要,则丢弃)
不确定Robomongo测试,但在Studio 3T(以前称为Robomongo)中,您可以在Intellishell控制台中复制/粘贴此查询,或在聚合选项卡中复制/导入(小图标“从剪贴板粘贴”)。
希望有帮助。