可以說我有這些課程:
public class Foo
{
public IReadonlyDictionary<string, DateTime> Values { get; set; }
}
public class Bar
{
public Foo Foo { get; set; }
}
現在如果我做這個預測:
var projection = Builders<Bar>.Projection.Expression(x => x.Foo.Values["key"])
如果字典中不存在該元素,我將得到DateTime.MinValue而不是 null 。key該值本身確實不能為空(我認為這就是 MongoDB 這樣做的原因default(DateTime)),但它可能發生在字典中不存在。
我想知道是否有一種好方法可以告訴 MongoDB 結果應該是DateTime?這樣,以便在元素不存在的情況下我可以獲得 null。
PS我可以使字典值DateTime?,這會起作用,但我寧愿避免它,因為它Value本身不應該為空。
樣本檔案:
// With values
{
"_t": "Bar",
"Foo":
{
"1521": "2022-09-26T08:25:38.502 00:00"
}
}
// Empty
{
"_t": "Bar",
"Foo":
{
}
}
uj5u.com熱心網友回復:
以下查詢將值回傳為DateTime?; 如果沒有Foo,則為null,如果已設定,則回傳值:
var bars = await (await barColl.FindAsync(
Builders<Bar>.Filter.Empty,
new FindOptions<Bar, DateTime?>()
{
Projection = Builders<Bar>.Projection.Expression(
x => (DateTime?) (x.Foo == null ? null : x.Foo.Value))
})).ToListAsync();
對于以下檔案
{ "_id": { "$oid": "632dc047e08f08bfaeabc2d6" }, "Foo": null}
{ "_id": { "$oid": "632dc047e08f08bfaeabc2d7" }, "Foo": { "Value": { "$date": { "$numberLong": "1663942727428" } } }}
結果是
null
2022-09-23T14:18:47Z
更新:字典
如果DateTime要從 a投影Dictionary<string, DateTime>,可以將以下運算式與檢查 的三元運算子一起使用default(DateTime):
var projection = Builders<SoNullableDt>.Projection
.Expression<DateTime?>(
x => x.Foo["1521"] == default(DateTime) ? null : x.Foo["1521"]);
var result = await (await coll.FindAsync(Builders<SoNullableDt>.Filter.Empty,
new FindOptions<SoNullableDt, DateTime?>() { Projection = p })).ToListAsync();
根據示例檔案(在 MongoDB 中將 datetime 更改為 Date 資料型別),可以找到以下資料:
26.09.2022 08:25:38
null
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510638.html
