使用投影查找查询中的字段

时间:2012-08-15 20:29:39

标签: mongodb

我有一个Mongo查找查询,可以很好地从大文档中提取特定字段,如...

db.profiles.find(
  { "profile.ModelID" : 'LZ241M4' },
  {
    _id : 0,
    "profile.ModelID" : 1,
    "profile.AVersion" : 2,
    "profile.SVersion" : 3
  }
);

...这会产生以下输出。注意SVersion如何在文档中的AVersion之前出现,即使我的投影在SVersion之前要求AVersion。

{ "profile" : { "ModelID" : "LZ241M4", "SVersion" : "3.5", "AVersion" : "4.0.3" } }
{ "profile" : { "ModelID" : "LZ241M4", "SVersion" : "4.0", "AVersion" : "4.0.3" } }

......问题在于我希望输出为......

{ "profile" : { "ModelID" : "LZ241M4", "AVersion" : "4.0.3", "SVersion" : "3.5" } }
{ "profile" : { "ModelID" : "LZ241M4", "AVersion" : "4.0.3", "SVersion" : "4.0" } }

我需要做什么才能让Mongo JavaScript shell以我指定的字段顺序显示查询结果?

4 个答案:

答案 0 :(得分:8)

我现在明白了。您希望返回按“字段”排序的结果,而不是字段的值。

简单的回答是你不能这样做。也许它可能与新的聚合框架。但这对于订购领域来说似乎有些过分。

查找查询中的第二个对象用于包含或排除返回的字段,而不是用于排序它们。

  {
    _id : 0,               // 0 means exclude this field from results
    "profile.ModelID" : 1, // 1 means include this field in the results
    "profile.AVersion" :2, // 2 means nothing
    "profile.SVersion" :3, // 3 means nothing
  }

最后一点,你不应该这样做,谁关心这些领域的回归顺序。 无论字段的顺序如何,您的应用程序都应该能够使用它所需的字段。

答案 1 :(得分:1)

我通过使用别名投影字段而不是包含和排除0和1来实现它。 试试这个:

{
_id : 0,      
"profile.ModelID" :"$profile.ModelID", 
"profile.AVersion":"$profile.AVersion",
"profile.SVersion":"$profile.SVersion"
}

答案 2 :(得分:0)

自2.6版(于2014年发布)以来,MongoDB会在执行写操作(source)之后保留文档字段的顺序。

P.S。如果您使用的是Python,您可能会发现this很有趣。

答案 3 :(得分:0)

我为实现这一目标而采用的另一种解决方案如下:

db.profiles
  .find({ "profile.ModelID" : 'LZ241M4' })
  .toArray()
  .map(doc => ({
    profile: {
      ModelID: doc.profile.ModelID,
      AVersion: doc.profile.AVersion,
      SVersion: doc.profile.SVersion
    }
  }))