我正在尝试使用the $type
operator编写查询以匹配可能具有[HtmlTargetElement("label", Attributes = "asp-for")]
public class RequiredLabelTagHelper : LabelTagHelper
{
public RequiredLabelTagHelper(IHtmlGenerator generator) : base(generator)
{
}
public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
if (For.Metadata.IsRequired)
{
CreateOrMergeAttribute("class", "required", output);
}
return base.ProcessAsync(context, output);
}
private void CreateOrMergeAttribute(string name, object content, TagHelperOutput output)
{
var currentAttribute = output.Attributes.FirstOrDefault(attribute => attribute.Name == name);
if (currentAttribute == null)
{
var attribute = new TagHelperAttribute(name, content);
output.Attributes.Add(attribute);
}
else
{
var newAttribute = new TagHelperAttribute(
name,
$"{currentAttribute.Value.ToString()} {content.ToString()}",
currentAttribute.ValueStyle);
output.Attributes.Remove(currentAttribute);
output.Attributes.Add(newAttribute);
}
}
}
或'null'
类型的字段。当我只查询一个特定类型时,它可以工作:
'objectid'
当我撰写的查询也与> db.collections.post.findOne({$or: [{x: {$type: 'null'}}]}).then(console.log)
Promise { <pending> }
> { _id: 584f573f931f2b0bf4e3d339,
date: Mon Dec 12 2016 21:04:47 GMT-0500 (Eastern Standard Time),
title: 'hgfgh',
text: 'dhffgh',
userId: 584f573a931f2b0bf4e3d338,
x: null }
x
匹配时,我什么也得不回来:
objectid
我正在使用node-mongodb-native-2.2。
如果某个字段是> db.collections.post.findOne({$or: [{x: {$type: 'null'}}, {x: {$type: 'objectid'}}]}).then(console.log)
Promise { <pending> }
或null
,我该如何编写一个查询(我希望为验证程序编写此查询)?
答案 0 :(得分:0)
我使用的方法显然是正确的,只是我将'objectId'
(见“Available Types”)误导为'objectid'
。正确拼写类型名称会导致mongodb决定将查询解释为查询而不是字段匹配。
我对发生在我身上的事情的理论是,mongodb放弃了试图强迫我的查询作为“查询”,而是将其视为对象密钥匹配。我不确定如何避免这种情况,或者如果有一种方法可以让mongodb在无法解释$type
而不是静默地改变它解释查询的方式时引发错误。
编辑:啊,我也发现mongodb 是试图告诉我我的语法很糟糕。我刚刚没有在.catch()
上加Promise
。糟糕...