【问题标题】:MongoDb $match for embedded documentMongoDb $match 用于嵌入文档
【发布时间】:2015-04-14 05:29:49
【问题描述】:
db.entities.aggregate([$match : {"Company.Id" : {$gt : 11}}])

上面的代码在 mongo shell 中可以工作,但是下面的代码为什么不能工作??

db.entities.aggregate([{$match : {Company : {Id : {$gt : 11}}}}])

什么都不显示。

这是我的 mongodocument

 "_id" : ObjectId("552ca154993cfc98fef1e13c"),
 "Name" : "R",
 "Address" : "RAdd",
"Company" : {
     "Name" : "something",
     "Id" : 14
 }

【问题讨论】:

  • 不,我不是这个意思..!我想知道的是在 $project 的情况下,我能够以 db.entities.aggregate([{$project : {Company : {Name : 1}}}]) 的形式访问嵌入式文档,但在匹配 db.entities 的情况下.aggregate([{$match : {Company : {Id : {$gt : 11}}}}]) 不会给我任何结果,为什么??
  • @pilku:您在最初的问题中没有写关于$project任何东西。我们应该猜测吗?您可能想阅读How do I ask a good question,它提高了大幅获得有用答案的可能性。您可能会发现 ESR 的优秀文章 How To s The Smart Way 也很有帮助。

标签: mongodb


【解决方案1】:

来自 mongodb docs

当字段包含嵌入文档时,查询可以指定嵌入文档的完全匹配,也可以使用点符号指定嵌入文档中各个字段的匹配。

这样就可以了

db.entities.aggregate([{
       '$match':{
             "Company" : {
                 "Name" : "something",
                 "Id" : 14
                 }
             }
       }
])

【讨论】:

  • db.entities.aggregate([{$match : {Company : { Name : "something"}}}]) - 没有结果 db.entities.aggregate([{$match : {"Company.Name" : "something"}}]) - 给出结果
  • 它应该是嵌入文档而不是单个字段的完全匹配。如果您使用的是单个字段,则需要使用点表示法。
  • 嗯,是的,我尝试了相同的查找和相同的输出。但为什么不使用 $project 呢?我的意思是 $project link
  • 是的 $project link 是允许的。我猜这是因为为了执行匹配操作,它会查找 { <field>: <value> } 条件,试图将其与 Company 而不是 Name 匹配,而投影只是将具有指定字段的文档传递到管道中的下一个阶段。跨度>
  • 1.我们如何将上述查询转换为 java? 2. 假设我有 Map obj,它的结构低于 json,那么我们如何构造上述关于地图对象的查询。 { "Company" : { "Name" : "something", "Id" : 14 } }
猜你喜欢
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多