我有一个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以我指定的字段顺序显示查询结果?
答案 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)
答案 3 :(得分:0)
我为实现这一目标而采用的另一种解决方案如下:
db.profiles
.find({ "profile.ModelID" : 'LZ241M4' })
.toArray()
.map(doc => ({
profile: {
ModelID: doc.profile.ModelID,
AVersion: doc.profile.AVersion,
SVersion: doc.profile.SVersion
}
}))